我正在使用C,在下面的代码段中,我认为c
的分配是正常的。 cArr[]
的分配运行正常,但对我来说似乎不对。看来我应该使用类似的东西:
char cArr[3][80];
或者这些字符串是否放在堆上?
int main(int argc, char** argv)
{
char* c = "abcd";
char* cArr[3];
cArr[0] = "A string of of characters.";
cArr[1] = "Another inane comment.";
}
答案 0 :(得分:4)
第一种情况:
char* c = "abcd";
c
的类型为char *
。字符串"abcd"
的基址存储在其中。正确的。
第二种情况:
char* cArr[3];
cArr
是一个由三个char *
组成的数组。
cArr[0] = "A string of of characters.";
cArr[1] = "Another inane comment.";
也很好而且合法。您将字符串文字的基址存储到char *
类型的变量中(此处为cArr[n]
)。这没有问题。
或者这些字符串是否放在堆上?
不是真的。标准仅指定字符串文字应具有静态存储持续时间。通常,字符串文字放在只读内存位置,因此您可能无法修改 cArr[n]
指向的字符串。所以,基本上它是依赖于存储字符串文字的实现。正如this previous answer中所述,字符串存储在二进制文件的.rodata
部分中。
答案 1 :(得分:1)
char* c = "abcd";
使字符串文字和c
指向第一个元素的地址。
char* cArr[3];
创建一个包含三个char*
指针的数组,以下语句可用于使它们指向字符串文字,即static
:
cArr[0] = "A string of of characters.";
cArr[1] = "Another inane comment.";
以上陈述完全有效。字符串文字在rodata内存段中分配,因此它们是只读的,不可写。