关于常量在内存中的存储

wenjinghuan999 2011-02-18 03:34:22

int a = 10;

这句代码里的 a 存储在栈区,10存储在常量区,对吗?还是10直接从代码区里读取并赋值给栈区中的 a ?
(网上看到有人说10也在栈区,不知道什么意思)

还有这句:

char * c;
c = "123456";

我的理解是常量区中既有123456\0,又有指向'1'的指针,赋值时将指向1的指针赋值给c,对吗?
...全文
399 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
pathuang68 2011-02-23
  • 打赏
  • 举报
回复
看看一个进程在内存中的布局就知道了。
hxDreamer 2011-02-23
  • 打赏
  • 举报
回复
int a = 10;
----10应该在代码段,反汇编可以看到应该有个 MOV (某通用寄存器),10

char * c;
c = "123456";
----字符串一般储存在其他段吧(想不起来了,不过可以做个程序,反编译看看,用IDA比较好)

mov dword ptr [esp+1Ch], offset a1234567 ; "1234567"

...

.rdata:00403064 a1234567 db '1234567',0 ; DATA XREF: sub_4013C0+Eo

哈哈 是在数据段吧

另外我还试了一下,MinGW编译器有警告deprecated conversion from string constant to 'char*',因为字符串常量是const char *类型
pengzhixi 2011-02-23
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 wenjinghuan999 的回复:]
引用 1 楼 pengzhixi 的回复:
10这样的立即数不用存储的。

第2个理解错了,只是将存放123456这个常量字符串的地址付给了c这个指针变量。

再多问一句
[code=C]/C++c="123456"[/code]
这句赋值语句,字符串的指针是作为立即数被赋值的吗?
[/Quote]
额,不是的。
direction917 2011-02-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zhao4zhong1 的回复:]
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
[/Quote]
大神,为什么怎么总是这么留言?

int a , 和char * c 都在栈上。
全局和静态的在静态存储区(好像是这个名字)。
good778899 2011-02-22
  • 打赏
  • 举报
回复
首先楼主“关于常量在内存中的存储”标题和内容不相符,


int a = 10;

char * c;
c = "123456";

都是变量的概念
wenjinghuan999 2011-02-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pengzhixi 的回复:]
10这样的立即数不用存储的。

第2个理解错了,只是将存放123456这个常量字符串的地址付给了c这个指针变量。
[/Quote]
再多问一句
[code=C]/C++c="123456"[/code]
这句赋值语句,字符串的指针是作为立即数被赋值的吗?
wenjinghuan999 2011-02-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 xwfde 的回复:]
谁告诉你程序运行时一定在栈上的?全局变量或static也在栈上吗?没事别老入栈,出栈,浪费cpu时间
[/Quote]
抱歉没说清楚……我是说局部变量的情形,全局和静态的当然不在栈上了……
FrankHB1989 2011-02-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 xwfde 的回复:]

引用 9 楼 fancybit 的回复:

成员变量的话 算在栈区么?
成员也要看是全局的还是局部的,跟成员不成员没关系,只跟全不全局有关
[/Quote]
只跟全不全局有关?局部静态变量呢?
雷孟德 2011-02-21
  • 打赏
  • 举报
回复
想弄清楚这个问题,最直接的办法就是把exe用调试器加载,看汇编,就知道存在什么地方了。
普通来说,串常量申明后立即赋给指针,该指针并不能重新赋值新串。也就是等于前面加了const的申明一样。

要想能赋值,就这样:

char *ptr_ch, ch_arry[]="this is my string!";

ptr_ch = ch_arry;

之后你就自由了。当然,串长有限制,就是数组的长度,超出长度使用就不安全了。
xwfde 2011-02-19
  • 打赏
  • 举报
回复
谁告诉你程序运行时一定在栈上的?全局变量或static也在栈上吗?没事别老入栈,出栈,浪费cpu时间
smartgotodo 2011-02-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zhao4zhong1 的回复:]
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
[/Quote]

同意,但是对于这位兄弟来说,应该有点困难。

C变量在计算机中就是内存,下面是简单的解释

int a=10;
在程序运行时栈上分配的内存,这块内存(4byte)被初始化为10。这句不存在常量区。


char * c;
c = "123456";
c是栈上的变量(4byte的内存 on x86),4byte的内存的内容是指针,"123456"存在于“常量区”

xwfde 2011-02-19
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 fancybit 的回复:]

成员变量的话 算在栈区么?
[/Quote]成员也要看是全局的还是局部的,跟成员不成员没关系,只跟全不全局有关
lhy 2011-02-19
  • 打赏
  • 举报
回复
10在代码里面
muku9527 2011-02-19
  • 打赏
  • 举报
回复
2楼正解,给分。
fancybit 2011-02-19
  • 打赏
  • 举报
回复
成员变量的话 算在栈区么?
赵4老师 2011-02-18
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
xwfde 2011-02-18
  • 打赏
  • 举报
回复
a =10,谁告诉你a 一定在栈中的?
xgy8705023 2011-02-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pengzhixi 的回复:]
10这样的立即数不用存储的。

第2个理解错了,只是将存放123456这个常量字符串的地址付给了c这个指针变量。
[/Quote]
+1 c这个指针变量存储的是字符串的首地址
  • 打赏
  • 举报
回复
立即数是存在代码段里的
  • 打赏
  • 举报
回复
10是立即数
c是存放字符串的地址
加载更多回复(1)

64,439

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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