问C的变量初始化的过程

yitaohust 2010-08-13 10:41:08
对底层了解太欠缺了,严重阻碍个人学习提高,所以请教大家指点:
比如在某个函数内部申明1个变量:char a = "hello!";
我的理解:首先在常量区申请块内容,存放"hello!"字符,然后在程序的栈中,为字符变量a申请个内存,变量a的内容是hello!。
问题是,变量a的内容是如何与hello!关联起来的?即栈区的a与常量区的hello!有关联吗?
这个问题可能问的比较蠢,比较难听懂,见谅。
或者推荐关于这方面的针对性的书或文档?
谢谢了!
...全文
150 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
kostion 2010-08-15
  • 打赏
  • 举报
回复
把你的c代码转成汇编代码,一目了然,gcc好像是-S参数
东大坡居士 2010-08-14
  • 打赏
  • 举报
回复
学无止境~~~~~~
laciqs 2010-08-14
  • 打赏
  • 举报
回复
1. 字符串字面值不是常量。
2. 所谓的“常量区”在Linux中应该指.rodata段,这个段和.text链接时合并到了Text Segment中,加载运行时操作系统把Text Segment的页面只读保护起来,防止意外改写。
初学时候只要用合理的抽象思维理解就可以,就像1L所说的,a的内容不是"hello!"(另外LZ少了一个*号,a的类型应该为char *),之后再深入底层一探究竟。
canshui 2010-08-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yitaohust 的回复:]
恩,一时手快写掉了*;a指针的内容是那块常量区的地址,明白了。
char c = 'a';
这块该如何理解呢?字符a也是存在常量区的吧,但常量区地址给一个非指针的变量,显然不能跟上面那个理解了吧。
[/Quote]
lz的理解,有些问题啊……
首先 你的 这个char c ; 不是指针类型
然后,char c 在哪里?
如果在main()外,也就是你定义成全局变量,就是为 c 在静态存储区分配空间,生存与整个程序运行过程中
如果在函数中,包括main函数 那么char a ;就是为 c 在动态存储区分配空间,就仅仅在函数内有效,函数调用结束,为它分配的空间也就释放
无论哪种变量,总是要先为 c 分配一个空间,把一个字符类型的值 a 放到这个空间里面
hrx1989 2010-08-13
  • 打赏
  • 举报
回复
学习!!!
brookmill 2010-08-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yitaohust 的回复:]
恩,一时手快写掉了*;a指针的内容是那块常量区的地址,明白了。
char c = 'a';
这块该如何理解呢?字符a也是存在常量区的吧,但常量区地址给一个非指针的变量,显然不能跟上面那个理解了吧。
[/Quote]
字符a不在常量区,而是直接写在汇编代码里面了。
这个变成汇编大致就是这样 mov [ebp-x], 97
yitaohust 2010-08-13
  • 打赏
  • 举报
回复
恩,一时手快写掉了*;a指针的内容是那块常量区的地址,明白了。
char c = 'a';
这块该如何理解呢?字符a也是存在常量区的吧,但常量区地址给一个非指针的变量,显然不能跟上面那个理解了吧。
brookmill 2010-08-13
  • 打赏
  • 举报
回复
另一种可能的写法是 char a[] = "hello!";
这个就和 char *a = "hello!"; 有本质区别。
程序的栈中,为字符数组a申请内存,然后运行到这个函数的时候,会把常量区的"hello!"复制到a的这块内存。这样,a的内容就是hello!了
「已注销」 2010-08-13
  • 打赏
  • 举报
回复
如果它是此函数第一个局部变量,它会变成 [ebp - 4] (在x86 ia32架构)

将“hello”的地址mov进[ebp - 4]既可以了。
lea eax, address of "hello"
mov [ebp-4],eax

应该会类似产生这样的代码吧。
brookmill 2010-08-13
  • 打赏
  • 举报
回复
刚才没注意,楼主这句写错了
char a = "hello!";
应该是
char *a = "hello!";
brookmill 2010-08-13
  • 打赏
  • 举报
回复
变量a的内容不是hello!。

首先在常量区申请块内容,存放"hello!"字符
这句话说对了。接下来,这块常量区的内存是有个地址的,而变量a是个指针,他的内容就是常量区的那个地址。a和常量区就是这么关联起来的。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧