V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Nicolay
V2EX  ›  C

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

  •  
  •   Nicolay · 2018-07-04 18:22:48 +08:00 · 2285 次点击
    这是一个创建于 2371 天前的主题,其中的信息可能已经有所发展或是发生改变。
    char buf2[10][30] = { "111111", "3333", "2222" };
    在以上的定义语句中,“ 111111 ”,“ 3333 ”,“ 2222 ”,是常量区的字符串常量吗?数组 buf2 中 存储的是 常量区的地址还是 字符?
    qiuyi116
        1
    qiuyi116  
       2018-07-04 19:29:10 +08:00 via iPhone
    不是字符串常量,就是二维数组。定义在函数内外,所在区域不同。
    lingdux
        2
    lingdux  
       2018-07-04 23:20:59 +08:00
    define 出来的才是常量。你这个是变量,怎么可能存再常量区。

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

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

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

    如果代码是 const char *buf2[10] = { "111111", "3333", "2222" },buf2 的元素是 const char 指针类型,其中保存的自然就是这三个字符串常量的地址了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   968 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 21:19 · PVG 05:19 · LAX 13:19 · JFK 16:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.