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中的内联字符串数组是不是分配在堆栈上?的主要内容,如果未能解决你的问题,请参考以下文章