LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: nait

c中作用域和生命周期的问题

[复制链接]
发表于 2005-3-12 12:40:55 | 显示全部楼层
"auto string"这个字符串不是分配在堆栈中,而是分配在数据段上(编译时初始化)。所以这个程序是正确的。
改成char p[] = "auto string";就出错。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-12 12:56:29 | 显示全部楼层
excellent
这样就对了
thx
回复 支持 反对

使用道具 举报

发表于 2005-3-13 11:23:15 | 显示全部楼层
用gcc -S可以得到汇编代码:

  1.         .file   "tt.c"
  2.         .section        .rodata
  3. .LC0:
  4.         .string "Return value is: %s\n"
  5. .LC1:
  6.         .string "%X\n"
  7.         .text
  8. .globl main
  9.         .type   main, @function
  10. main:
  11.         pushl   %ebp
  12.         movl    %esp, %ebp
  13.         subl    $24, %esp
  14.         andl    $-16, %esp
  15.         movl    $0, %eax
  16.         subl    %eax, %esp
  17.         call    beyond_boundary
  18.         movl    %eax, -4(%ebp)
  19.         movl    -4(%ebp), %eax
  20.         movl    %eax, 4(%esp)
  21.         movl    $.LC0, (%esp)
  22.         call    printf
  23.         movl    -4(%ebp), %eax
  24.         movl    %eax, 4(%esp)
  25.         movl    $.LC1, (%esp)
  26.         call    printf
  27.         leave
  28.         ret
  29.         .size   main, .-main
  30.         .section        .rodata
  31. .LC2:
  32.         .string "auto string"
  33.         .text
  34. .globl beyond_boundary
  35.         .type   beyond_boundary, @function
  36. beyond_boundary:
  37.         pushl   %ebp
  38.         movl    %esp, %ebp
  39.         subl    $24, %esp
  40.         movl    $.LC2, -4(%ebp)
  41.         movl    -4(%ebp), %eax
  42.         movl    %eax, 4(%esp)
  43.         movl    $.LC1, (%esp)
  44.         call    printf
  45.         movl    -4(%ebp), %eax
  46.         leave
  47.         ret
  48.         .size   beyond_boundary, .-beyond_boundary
  49.         .section        .note.GNU-stack,"",@progbits
  50.         .ident  "GCC: (GNU) 3.3.3 20040412 (Gentoo Linux 3.3.3-r6, ssp-3.3.2-2, pie-8.7.6)"
复制代码

可以看出,字符串是放在数据段上的。不是在堆栈分配的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-13 12:57:17 | 显示全部楼层
汇编看不懂啊:(
长路漫漫。。。。。。。。。。
回复 支持 反对

使用道具 举报

发表于 2005-3-13 19:11:14 | 显示全部楼层
学学就知道了。置顶的论坛索引中有一本《Programming from Ground Up》的下载地址,就学习linux汇编的入门书。用个十天半月看完后,就知道汇编是怎么回事了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-14 10:17:15 | 显示全部楼层
收到
以下载
不知道什么时候有时间看
谢谢kj老大:)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表