3
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

4 回答 4

7

您不能在 C 中分配给数组。C 允许使用编译时常量的值来初始化数组。如果您想稍后更改这些值,或者设置不是编译时常量的值,则必须手动分配给数组的特定索引。

所以,你的赋值sXSongBuffer在 C 中是不允许的。此外,因为sXSongBuffer[0]tosXSongBuffer[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 指针组成的数组,其中前三个元素指向缓冲区的字符串大小,即指向的 buffsXSongBuffer[0]不会容纳任何大于的字符串"Thriller",如果他这样做,sXSongBuffer[0] = malloc(32); 他会得到一个小内存韭菜. 此外,他必须malloc记住阵列中其余的每个插槽。他应该使用 OP 中的 2d char 数组 + 指定的 init,或者malloc在运行时使用每个缓冲区并复制值。他还需要记住free他的任何记忆malloc

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

char *sXSongBuffer[30];

这 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]is a char *,并且可以指向其中包含 achar的任何有效位置。

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

于 2010-02-16T10:25:04.417 回答
0

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

于 2010-02-16T10:11:58.527 回答
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);
于 2010-02-16T10:20:37.733 回答
0

看看指定初始化器

#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"
};
于 2010-02-16T11:02:02.257 回答