Michael Gong wrote: > Though it's not related with gcc, could anyone help me with following > question: > > Where is the string literal allocated ? Is it on the stack ? > > For example, where is "abc" allocated ? > > char * foo() { > return "abc"; > } Everyone else has already answered your question directly, but I'd like to point out that the compiler is not a black box -- you can easily see exactly what it's doing with a few simple commands. Check the docs for on -S, -save-temps, -fverbose-asm, etc. For example: $ echo 'char * foo() { return "abc"; }' | gcc -x c - -S -o - .file "" .section .rodata .LC0: .string "abc" .text .globl foo .type foo, @function foo: pushl %ebp movl %esp, %ebp movl $.LC0, %eax popl %ebp ret .size foo, .-foo .ident "GCC: (GNU) 4.0.4 20060507 (prerelease) (Debian 4.0.3-3)" .section .note.GNU-stack,"",@progbits As you can see, it goes in the .rodata section. The above is the behavior under linux, but for PE (Win32) it is a different section: $ echo 'char * foo() { return "abc"; }' | gcc -x c - -S -o - .file "" .section .rdata,"dr" LC0: .ascii "abc\0" .text .globl _foo .def _foo; .scl 2; .type 32; .endef _foo: pushl %ebp movl %esp, %ebp movl $LC0, %eax popl %ebp ret That is my second point: this kind of thing is platform-dependant (although it can never be on the stack), and you didn't mention at all what platform you are using in your original question, which should be a requirement for almost any compiler/toolchain question. Brian