先从一个面试常问题开始把^_^:
#include
char* getstring()
{
char *str = "alctel-lucent";
return str;
}
int main()
{
char* string = getstring();
printf("string = %s\n",string);
}
这样是可以正常输出的.
#include
char* getstring()
{
char str[20] = "alctel-lucent";
return str;
}
int main()
{
char* string = getstring();
printf("string = %s\n",string);
}
呵呵,这样的输出就是不确定的了.
注意char *str和char str[]是不一样的,可以通过汇编代码得知,前者在栈空间中分配的只是string指针,
而后者则是把字符串的内容放入了栈中."alctel-lucent"是字符串常量
getstring返回指针,函数返回后,堆栈撤销.所以你就知道why了.
来点好玩的
#include
#include
int main()
{
char *s = "hello";
strcpy(s, "shit");
printf("hello");
return 0;
}
都知道这会导致Segmentation fault
看看汇编代码, gcc -S -o test.s test.c
打开test.s文件
.file "test.c"
.section .rodata
.LC0:
.string "hello"
.LC1:
.string "shit"
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
andl $-16, %esp
movl $0, %eax
subl %eax, %esp
movl $.LC0, -4(%ebp)
movl $.LC1, 4(%esp)
movl -4(%ebp), %eax
movl %eax, (%esp)
call strcpy
movl $.LC0, (%esp)
call printf
movl $0, %eax
leave
ret
.size main, .-main
.ident "GCC: (Ubuntu 4.3.2-1ubuntu11) 4.3.2"
.section .note.GNU-stack,"",@progbits
看到第二行了吗, .section .rodata , 字符串常量是被放在rodata segmentation中的
也就是代码区, 是只读的, 这样做是为了实现常量这个概念的, 你一定不会想printf("hello");
打印出来的会是"shit"吧, 可以试试将 .section .rodata改成 .section .data, 然后再编
译一下 gcc -o test test.s, 看看结果是什么
阅读(1193) | 评论(0) | 转发(0) |