C中的内联字符串数组是不是分配在堆栈上?

Posted

技术标签:

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

在 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 【参考方案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

以上是关于C中的内联字符串数组是不是分配在堆栈上?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 C 中的堆栈数组分配失败?

堆栈上的C数组

C中堆栈上的动态数组分配

字符串 [] 数组中的 C# 内联条件

C 数组实例化 - 堆栈或堆分配?

如何在堆栈上分配数组以获得性能提升?