请教一个 c 语言的 字符串常量 和 二维数组的简单问题,请前辈们不吝解答!

2018-07-04 18:22:48 +08:00
 Nicolay
char buf2[10][30] = { "111111", "3333", "2222" };
在以上的定义语句中,“ 111111 ”,“ 3333 ”,“ 2222 ”,是常量区的字符串常量吗?数组 buf2 中 存储的是 常量区的地址还是 字符?
2162 次点击
所在节点    C
3 条回复
qiuyi116
2018-07-04 19:29:10 +08:00
不是字符串常量,就是二维数组。定义在函数内外,所在区域不同。
lingdux
2018-07-04 23:20:59 +08:00
define 出来的才是常量。你这个是变量,怎么可能存再常量区。

这个存储有两种可能,取决于你写在什么地方。
一种是全局变量,存在全局变量和静态变量的存储区域。
另一种是局部变量,存储在栈中。

这个问题跟踪一下汇编代码看一下内存一目了然。
onemoo
2018-07-05 00:58:02 +08:00
> "111111", "3333", "2222" 是常量区的字符串常量吗?
你指的是等号右侧大括号中的这三个的话,那么是的。这样写出来的字符串字面量是不可更改的,可能会放在只读数据区。

> 数组 buf2 中 存储的是 常量区的地址还是 字符?
当初始化数组时,等号右侧的大括号中的每一项被用来初始化数组的相应元素。
这里 buf2 数组的元素还是数组,所以(前三个)数组元素是由字符串字面量("111111", "3333", "2222")来初始化的。
用字符串字面量初始化 char 数组时,数组中直接保存这些字符。所以 buf2[0] 中就直接存储了 "111111" 这几个字符。
那么,buf2 中保存的是这些字符,不是地址。

如果代码是 const char *buf2[10] = { "111111", "3333", "2222" },buf2 的元素是 const char 指针类型,其中保存的自然就是这三个字符串常量的地址了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/468148

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX