分配给字符串数组

时间:2015-03-19 12:07:47

标签: c arrays string pointers

我正在使用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.";
}

2 个答案:

答案 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内存段中分配,因此它们是只读的,不可写。