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"};
答案 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)
#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"
};