【问题标题】:Are inline string arrays in C allocated on the stack?C中的内联字符串数组是否分配在堆栈上?
【发布时间】:2024-05-20 03:50:02
【问题描述】:

在 C 中,考虑以下“内联”字符串数组:

char *string1 = "I'm a literal!";
char *string2 = malloc((strlen(string1) + 1) * sizeof(char));
//Do some string copying
...
char string3[] = {'a','b','c','\0'};
char *stringArray[] = {string1, string2, string3};

stringArray 是否会简单地包含三个指针中的每一个的副本?

数组会被分配到栈上吗?

【问题讨论】:

  • 注意:string3 不是以 null 结尾的。不要尝试在上面使用str(n)len

标签: c arrays string stack


【解决方案1】:

stringArray 分配在堆栈上,它的每个元素都是指向char 的指针。更具体地说:

  • string1指针在栈上,它的值是数据段中只读字符串的第一个字符的地址
  • string2指针在栈上,它的值是在堆上分配的内存块的地址
  • string3 是一个数组,在堆栈上占用了 4 * sizeof(char) 个字节
  • stringArray 是一个数组,在堆栈上占用了 3 * sizeof(char *) 个字节。

【讨论】:

  • 所有元素都不是指向char 数组的指针,而是char * 类型的指针——即指向char 的指针。
  • 实际上,string3 将有 4 * sizeof(char) (即空值多了一个字节)。
  • @Lee-Man 问题已被编辑:我正在纠正我的答案
【解决方案2】:

是的(它确实包含指针的副本(见下文)),是的(数组在堆栈上)。

string3 不是指针,而是数组)。

【讨论】:

    【解决方案3】:

    假设您的代码片段是函数的一部分(看起来确实如此,因为您“进行了一些字符串复制”),那么是的,除了 string2 的存储(因为它是 malloc()ed)之外的所有内容都是在堆栈上。

    【讨论】:

    • 错误。 "I'm a literal" 也未在堆栈上分配。一般在.data