关于数组常量和指针

bluesnail1986 2011-12-24 04:06:55
char s1[] = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";

s1是在运行时赋值,而s2是在编译时就确定的,想问问为什么....?谢了先...
...全文
187 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
iamnobody 2011-12-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 it_leaf 的回复:]
引用 7 楼 mingliang1212 的回复:

引用 6 楼 it_leaf 的回复:

常量内存区里面的初始化应该是在编译时候做的做的吧,所以说编译的时候只生成代码不合适吧


编译期间只生成代码.绝对不会对内存区初始化.因为程序执行之前是没有拥有任何内存的.甚至代码都不在内码中.只有当操作系统加载了代码,才有可能执行任何操作,包括全局对象的初始化.之类的.



4……
[/Quote]

全局对象的初始化在main函数之前 .
CoolEgos 2011-12-25
  • 打赏
  • 举报
回复
都是赋值吧,赋的内容不同而已
自信男孩 2011-12-25
  • 打赏
  • 举报
回复
常量是不是属于代码段呢?
iamnobody 2011-12-25
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 it_leaf 的回复:]
引用 12 楼 mingliang1212 的回复:

引用 9 楼 it_leaf 的回复:
这种常量字符和全局对象没什么关系吧,全局变量是在运行main函数之前初始化,但是常量字符应该是在运行前就已经在内存里面的
[/Quote]

我只能说....不是....
IT_LEAF 2011-12-25
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 mingliang1212 的回复:]

引用 9 楼 it_leaf 的回复:
引用 7 楼 mingliang1212 的回复:

引用 6 楼 it_leaf 的回复:

常量内存区里面的初始化应该是在编译时候做的做的吧,所以说编译的时候只生成代码不合适吧


编译期间只生成代码.绝对不会对内存区初始化.因为程序执行之前是没有拥有任何内存的.甚至代码都不在内码中.只有当操作系统加载了代码,才有可能执行任何操作,包括……
[/Quote]
这种常量字符和全局对象没什么关系吧,全局变量是在运行main函数之前初始化,但是常量字符应该是在运行前就已经在内存里面的
Moral 2011-12-25
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 mingliang1212 的回复:]

引用 9 楼 it_leaf 的回复:
引用 7 楼 mingliang1212 的回复:

引用 6 楼 it_leaf 的回复:

常量内存区里面的初始化应该是在编译时候做的做的吧,所以说编译的时候只生成代码不合适吧


编译期间只生成代码.绝对不会对内存区初始化.因为程序执行之前是没有拥有任何内存的.甚至代码都不在内码中.只有当操作系统加载了代码,才有可能执行任何操作,包括……
[/Quote]
123
IT_LEAF 2011-12-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 mingliang1212 的回复:]

引用 6 楼 it_leaf 的回复:

常量内存区里面的初始化应该是在编译时候做的做的吧,所以说编译的时候只生成代码不合适吧


编译期间只生成代码.绝对不会对内存区初始化.因为程序执行之前是没有拥有任何内存的.甚至代码都不在内码中.只有当操作系统加载了代码,才有可能执行任何操作,包括全局对象的初始化.之类的.
[/Quote]


4: char s1[] = "aaaa";
00401048 mov eax,[string "aaaa" (00431024)]
0040104D mov dword ptr [ebp-8],eax
00401050 mov cl,byte ptr [string "aaaa"+4 (00431028)]
00401056 mov byte ptr [ebp-4],cl
5: char *s2 = "bbbb";
00401059 mov dword ptr [ebp-0Ch],offset string "bbbb" (0043101c)

内存
0043101C 62 62 62 62 bbbb
00431020 00 00 00 00 ....
00431024 61 61 61 61 aaaa
IT_LEAF 2011-12-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 mingliang1212 的回复:]

引用 6 楼 it_leaf 的回复:

常量内存区里面的初始化应该是在编译时候做的做的吧,所以说编译的时候只生成代码不合适吧


编译期间只生成代码.绝对不会对内存区初始化.因为程序执行之前是没有拥有任何内存的.甚至代码都不在内码中.只有当操作系统加载了代码,才有可能执行任何操作,包括全局对象的初始化.之类的.
[/Quote]
可是在代码执行main函数之前,我查看的内存时候就已经看得到aaaaaaaa和bbbbbbbb了
iamnobody 2011-12-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 it_leaf 的回复:]

常量内存区里面的初始化应该是在编译时候做的做的吧,所以说编译的时候只生成代码不合适吧

[/Quote]
编译期间只生成代码.绝对不会对内存区初始化.因为程序执行之前是没有拥有任何内存的.甚至代码都不在内码中.只有当操作系统加载了代码,才有可能执行任何操作,包括全局对象的初始化.之类的.
IT_LEAF 2011-12-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mingliang1212 的回复:]

引用 2 楼 bluesnail1986 的回复:
引用 1 楼 mingliang1212 的回复:

s1是一个字符串数组,"aaaaaaaa"是这个数组的初始值.所以运行到这里时,要把数组初始化,也就是运行时赋值.

s2是一个char*类型的指针,"bbbbbbb"是在常量区分配好空间的字符串,这种写法的意思是,用该字符串的首元素指针初始化s2.

那在编译阶段,编译器对s……
[/Quote]
常量内存区里面的初始化应该是在编译时候做的做的吧,所以说编译的时候只生成代码不合适吧
Saleayas 2011-12-24
  • 打赏
  • 举报
回复
对于 s1 , 在编译的时候,系统把"aaaaa"这个数据指定了一个符号叫做 s1.
所以 s1 仅仅是一个有意义的符号,她表示 "aaaaa" 这个数据,可以进行很多操作,但是不能给她赋值。
因为符号是没有自己的存放空间的。

对于 s2 , 在编译的时候,系统为她指定了一个位置,所以她又自己的存放空间,这就是变量。
这里需要区别的是 int a; 和 const int a; 的差别。
同时,在编译的时候,编译器为这个变量指定了一个初始值,这个初始值为 "bbbbb" 的缺省符号。

IT_LEAF 2011-12-24
  • 打赏
  • 举报
回复
[Quote=引用楼主 bluesnail1986 的回复:]
char s1[] = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";

s1是在运行时赋值,而s2是在编译时就确定的,想问问为什么....?谢了先...
[/Quote]
这种说法不合适的,编译过程都只是在常量存储区存放字符,对s1和s2什么都没做,只是运行时候s1需要把常量存储区中的字符复制到s1说指向的内存也就是栈中,这就是我们常说的赋值,而s2只是被赋值了一个地址
iamnobody 2011-12-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bluesnail1986 的回复:]
引用 1 楼 mingliang1212 的回复:

s1是一个字符串数组,"aaaaaaaa"是这个数组的初始值.所以运行到这里时,要把数组初始化,也就是运行时赋值.

s2是一个char*类型的指针,"bbbbbbb"是在常量区分配好空间的字符串,这种写法的意思是,用该字符串的首元素指针初始化s2.

那在编译阶段,编译器对s1做了什么呢?
[/Quote]

在编译阶段只会生成代码.任何对象都是在运行时才产生的.也就是说编译器什么都不能对s1,s2做.他只能写出代码,告诉计算机执行到这里时对s1,s2做什么.
"aaaaaa","bbbbb"是在常量区的字符串,在开始进入main函数之前已经在内存中了.
然后运行到该语句时就会按我1楼说的那样初始化.
bluesnail1986 2011-12-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mingliang1212 的回复:]

s1是一个字符串数组,"aaaaaaaa"是这个数组的初始值.所以运行到这里时,要把数组初始化,也就是运行时赋值.

s2是一个char*类型的指针,"bbbbbbb"是在常量区分配好空间的字符串,这种写法的意思是,用该字符串的首元素指针初始化s2.
[/Quote]
那在编译阶段,编译器对s1做了什么呢?
iamnobody 2011-12-24
  • 打赏
  • 举报
回复
s1是一个字符串数组,"aaaaaaaa"是这个数组的初始值.所以运行到这里时,要把数组初始化,也就是运行时赋值.

s2是一个char*类型的指针,"bbbbbbb"是在常量区分配好空间的字符串,这种写法的意思是,用该字符串的首元素指针初始化s2.

69,373

社区成员

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

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