在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
只包含三个指针的副本吗?
数组是否会在堆栈上分配?
答案 0 :(得分:9)
stringArray
在堆栈上分配,其每个元素都是指向char
的指针。更具体一点:
string1
指针位于堆栈上,其值是数据段中只读字符串的第一个字符的地址string2
指针位于堆栈上,其值是堆上分配的内存块的地址string3
是一个占用堆栈上4 * sizeof(char)
个字节的数组stringArray
是一个占用堆栈3 * sizeof(char *)
个字节的数组。答案 1 :(得分:1)
是(它确实包含指针的副本(见下文)),是的(数组在堆栈上)。
(string3
不是指针,而是数组)。
答案 2 :(得分:0)
假设你的代码片段是一个函数的一部分(它看起来像是,因为你“做了一些字符串复制”),那么是的,除了string2的存储(因为它是malloc()ed)将是在堆栈上。