为什么我不能初始化像这样的cstrings数组?

时间:2010-02-16 10:10:18

标签: c cstring

char sXSongBuffer[20][30];
sXSongBuffer = {"Thriller", "Don't Stop Till You Get Enough", "Billy Jean"};

为什么会返回错误expected expression before ‘{’ token?我想像这样初始化我的数组的原因是我可以在以后改变它的内容:

sXSongBuffer = {"New Song", "More Music From Me"};

4 个答案:

答案 0 :(得分:6)

您无法在C中分配数组.C允许初始化数组,其值为编译时常量。如果要稍后更改值,或者设置非编译时常量的值,则必须手动分配给该数组的特定索引。

因此,您在C中不允许转让sXSongBuffer。此外,由于sXSongBuffer[0]sXSongBuffer[19]也是数组,您甚至不能说:sXSongBuffer[0] = "New Song";

根据您的需要,这可能对您有用:

/* declare sXSongBuffer as an array of pointers */
char *sXSongBuffer[30] = {
    "Thriller",
    "Don't Stop Till You Get Enough",
    "Billy Jean",
    NULL /* set the rest of the elements to NULL */
};
size_t i;
/* and then later in your code */
sXSongBuffer[0] = "New Song";
sXSongBuffer[1] = "More Music From Me";
for (i=2; i < sizeof sXSongBuffer; ++i)
    sXSongBuffer[i] = NULL;

但是只有在编译时知道所有字符串时,上述内容才有效。如果没有,您将必须决定是否需要“足够大”的数组,或者您是否需要动态内存以用于字符串和/或字符串数​​量。在这两种情况下,您都希望使用等效的strcpy()来复制字符串。

编辑:回复评论:

  

你正在声明一个包含30个char指针的数组,前三个元素指向缓冲区字符串的大小,即sXSongBuffer[0]指向的buff不会包含任何大于{{1}的字符串如果他做"Thriller"他会得到一个小记忆韭菜。此外,他必须为阵列中其余每个插槽提供sXSongBuffer[0] = malloc(32);个内存。他应该使用像OP +指定的init中的2d char数组,或者在运行时使用malloc每个缓冲区并复制值。他还需要记住malloc free的任何记忆{/ 1}}。

malloc中的

sXSongBuffer是一个大小为30的数组,每个元素都是char *sXSongBuffer[30];,指向char *的指针。当我这样做时:

char

这30个指针中的每一个都未初始化。当我这样做时:

char *sXSongBuffer[30];

我将指针设置为不同的只读位置。没有什么可以阻止我在其他地方“重新点”指针。好像我有:

char *sXSongBuffer[30] = { "Thriller", ... };

在上面的代码段中,我首先将char *data = "Hello"; printf("%s\n", data); data = "Hello, world"; printf("%s\n", data); 分配给data,然后将其更改为稍后指向更长的字符串。我在上面的答案中所做的代码只是稍后将"Hello"重新分配给其他内容,并且由于sXSongBuffer[i]是指针,因此分配正常。特别是,sXSongBuffer[i]sXSongBuffer[0],可以指向其中包含char *的任何有效位置。

正如我在后面的回答中所说,如果字符串在编译时是未知的,则此方案不起作用,并且必须使用具有“足够大”大小的数组,或者动态分配大的内存够了。

答案 1 :(得分:0)

C没有通用数组文字。 {}列表语法仅在初始化时有效,即在声明变量的同一语句中赋值时。

答案 2 :(得分:0)

你不能只写

char sXSongBuffer[20][30];
sXSongBuffer = {"Thriller", "Don't Stop Till You Get Enough", "Billy Jean"};

您必须立即初始化数组(但它只包含3个项目):

char * sXSongBuffer[]= {"Thriller", "Don't Stop Till You Get Enough", "Billy Jean"};

或者在每个项目上使用stnrcpy

char sXSongBuffer[20][30];
strncpy(sXSongBuffer[0],"Thriller",29);
strncpy(sXSongBuffer[1],"Don't Stop Till You Get Enough",29);
strncpy(sXSongBuffer[2],"Billy Jean",29);

答案 3 :(得分:0)

看看Designated Initializers

#include <stdio.h>

int main (void) {

    char a[6][6] = { [2] = "foo", [4] = "bar" };

    for (int i=0; i<6; ++i)
        printf("%d == %s\n", i, a[i]);

    return 0;
}

这是一个c99功能。编译:

gcc -W -std=c99 2dInit.c -o 2dInit

输出:

0 == 
1 == 
2 == foo
3 == 
4 == bar
5 == 

在您的情况下,您想要这样做:

char sXSongBuffer[20][30] = { 
    [0] = "Thriller", 
    [1] = "Don't Stop Till You Get Enough", 
    [2] = "Billy Jean"
};