gpt4 book ai didi

c - C中的字符串数组在内存中是什么样子的?

转载 作者:太空狗 更新时间:2023-10-29 16:00:57 26 4
gpt4 key购买 nike

我试图弄清楚 2d 字符数组在内存中的样子。例如:

    char   c[][5]={"xa","ccc","bb","j","a","d"};

printf("TEST: %u %u %u %u \n\n",c[0],*c[0],c[0]+1,*(c[0]+1));

输出:

测试:3214246874 120 3214246875 97

c[0]=*(c+0) 是字符串“xa”,等于 3214246874,所以我猜 c[0] 是字符数组“xa”的地址。当我将 * 放入 c[0] 时,我得到 120,即 ascii 中的“x”。

所以我认为 c 数组中的第一个空格是 char x 的地址。之后,我对 c[0]+1 进行了相同的尝试,它打印了下一个地址,然后我输入 * 并得到 ,97,它是 ascii 中的“a”。

所以我假设数组 c 看起来像这样:

c[0]                              c[1]
------------------------------------------------------------------
| pointer to x | pointer to a ||| pointer to c | pointer to c | etc ...
----------------------------------------------------------------------

但是我在网上搜索了一下,没有找到任何证据证明我的假设。

最佳答案

您将 C 中使用的术语“字符串”的两种含义混为一谈。

最正确的是,C 字符串是 char 的空终止数组。您已经声明了一个 char 数组数组,并使用以 null 结尾的 char 序列对其进行了初始化。将其描述为“字符串数组”是完全合理的。

然而,数组与指针完全不同。你的数组的元素是其他数组,每个(在你的例子中)有五个 chars 长。这就是术语“字符串”的另一种含义出现的地方。C 数组有点滑;如果计算数组类型的(子)表达式,它将计算为指向第一个数组元素的指针。在字符串的情况下,这样的指针的类型为 char *,因此通常将指向字符串的指针称为字符串本身。然而,这是口语化的说法,如果您不了解这两个相关含义之间的区别,您就会惹上麻烦。

分解您的示例代码:

    char   c[][5]={"xa","ccc","bb","j","a","d"};

printf("TEST: %u %u %u %u \n\n",c[0],*c[0],c[0]+1,*(c[0]+1));
  • 表达式 c[0] 指定一个包含五个 char 的数组。当在函数调用表达式的上下文中计算时,它成为指向数组第一个元素的指针。此值的类型为 char *,这不是相应 printf 字段描述符 %u 的正确类型。未定义的行为结果。您可以通过将参数转换为 void * 并将字段描述符更改为 %p 来更正此问题。

  • 鉴于 c[0] 求值为指向第一个成员数组的第一个 char 的指针,因此表达式 *c [0] 计算指向的 char。此值再次无法匹配相应的字段描述符,该描述符应为 %c —— 然后您应该期望打印“x”。或者,您可以强制转换值:(unsigned int)*c[0]。在这种情况下,您会希望打印出“x”的数字代码;那很可能是 120。实际上,120 是实际打印的值,它是程序未定义行为的具体表现形式的一个无关紧要的特征。

  • 再次假定 c[0] 求值为指向第一个成员数组的第一个 char 的指针,因此 c[0 ] + 1 是一个 pointer 添加,导致指向该数组中第二个 char 的指针。对于 c[0],这与格式不匹配。

  • 到此为止,*(c[0] + 1) 的计算结果可能是第二个 char(在索引 1 处)数组 c[0]。该表达式严格等同于 c[0][1]。这又与格式不匹配。

so I assumed the array c looks like this [...]

没有。该数组如下所示:

| c[0]         | c[1]         | c[2]         | c[3]         | c[4]         | c[5]         |
x a \0 \0 \0 c c c \0 \0 b b \0 \0 \0 j \0 \0 \0 \0 a \0 \0 \0 \0 d \0 \0 \0 \0

关于c - C中的字符串数组在内存中是什么样子的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41552297/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com