It says "str is an immutable sequence of UTF-8 bytes of dynamic length somewhere in memory"
I just want to ask if str types are allocated on the stack or not ? I am also confused now, if the fixed length arrays of type: [T] are stored on the heap or on the stack.
The thing I know is the references to any type are stored on the stack itself. So, &str or &[T] will be stored on the stack for sure.
means just that: it's not a sequence of UTF-8 bytes on the stack, or a sequence of UTF-bytes on the heap, or in static memory or anywhere else. It's a sequence of UTF-8 bytes somewhere.
If you make a String and call .as_str() on it, you get a &str that refers to bytes on the heap.
If you use the string literal syntax "this is a string", you get a &str that refers to bytes in static memory.
If you create an array of bytes and assign it to a local variable let a = [b'h', b'e', b'l', b'l', b'o']; and use std::str::from_utf8 to borrow a str from it, you get a &str that refers to bytes on the stack.
Similarly, you can get a &[T] from borrowing an array anywhere in memory, whether it's on the stack or the heap or static memory or none of the above (a mmap'd file, for instance).
For example. A hardcoded string will probably be stored in the bss. But you could also take reference to somewhere in a String, in this case it'll be in the heap.
Also note that this isn't specific to strings or arrays. You can put a value of any type on the stack or on the heap (and you can put simple types into static memory), and you can then create a reference to it. A reference doesn't care where its referent is; it will point to the correct memory address. Memory is just memory, anyway.