Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4758649
  • 博文数量: 930
  • 博客积分: 12070
  • 博客等级: 上将
  • 技术积分: 11448
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-15 16:57
文章分类

全部博文(930)

文章存档

2011年(60)

2010年(220)

2009年(371)

2008年(279)

分类: LINUX

2009-04-05 22:17:21

 先从一个面试常问题开始把^_^:

#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, 看看结果是什么

阅读(1153) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~