[英]Syntax Error : '{'
我正在编写一个使用整数数组的C程序,该数组是结构的一部分。 结构为:
struct test
{
int *ques;
int a;
int b;
int len; // len is the length of the array defined in the structure as ques.
};
在此声明之后的函数中,我为len分配了一个值:
cases[0].len=5; // here cases is an array of the type struct test.
然后我已经使用malloc
分配内存以阵列构件ques
如下:
cases[0].ques=(int *)malloc(cases[counter].len*sizeof(int));
之后,我尝试按如下所示填写数组ques
:
cases[0].ques[5]={-7,-6,-5,-4,-3};
在编译时,在上面的行中出现错误,指出:
maxmin.c(47) : error C2059: syntax error : '{'
你能帮我吗?
这是无效的: cases[0].ques[5]={-7,-6,-5,-4,-3};
您只能在声明数组时以这种方式用C初始化数组。
要在此时在C程序中填写值,应使用for
循环分别填充每个索引。
现在,C编译器将此语句解析为:
指数的值5
阵列的ques
在索引0
的结构阵列cases
类型的struct test
是{-7,-6,-5,-4,-3}
这当然是因为无效不能使用{
而将值分配给一个变量。
更新OP的评论:
您可以将所有值保留在temp数组中,例如: int temp[50] = {...};
然后在为ques
分配空间之后,可以使用memcpy
函数将len
个值复制到ques
。
如果您拥有C99或C11,则可以将复合文字与memcpy()
或memmove()
结合使用来初始化新数组:
memmove(&cases[0].ques, (int []){-7,-6,-5,-4,-3}, 5 * sizeof(int));
这也解决了您将cases[0].ques
分配为指向5个整数的指针的问题,但是随后您尝试分配给超出分配数组末尾的单个元素。 该代码也不一致,因为其中大多数引用cases[0]
但是malloc()
调用引用了参数列表中的cases[count]
。 不会自动出错,但是绝对不寻常。
数组文字可以根据需要任意大。 唯一棘手的问题是memmove()
的size参数(第三个参数memmove()
。 我很快就躲开了; 重复复合文字感觉不正确,但是手动计数也不是一个好的解决方案。
好吧,如果memmove()
不是反对接受7个参数而不是3个参数的宏(在Mac OS X 10.9.2上为GCC 4.8.2 memmove()
,您可以!
(memmove)(&cases[0].ques, (int []){-7,-6,-5,-4,-3}, 5 * sizeof(int));
memmove(&cases[0].ques, ((int []){-7,-6,-5,-4,-3}), 5 * sizeof(int));
第一个调用函数memmove()
,而不是宏。 第二个通过将括号括在复合文字上来创建单个参数。 两者都编译。
请注意,尽管复合文字看起来像是强制转换和大括号初始化程序,但我不确定它严格来说是强制转换-最好不要将其视为强制转换,而应将其视为复合文字。
顺便说一句,如果目标是将N个随机值添加到N个整数的数组中(如对其他答案之一的评论中所述),则您将不希望使用此技术-示例中的整数不可信,因为随机序列。 如果您确实希望在某个范围内有50个随机数,则可以使用一个随机数生成器(可能是rand()
,可能是lrand48()
,还可能是其他东西)来创建一个适当范围内的值,并使用简单的for
循环进行初始化正确数量的数组元素。
为每个数组元素分配值,
cases[0].ques[0]=-7
cases[0].ques[1]=-6
...
cases[0].ques[5]=-3
因为您要在声明后分配值。 C允许{}在声明时用于初始化数组。 在那之后。
ques[5]
是一个int
,不能为其分配数组
同样,C不允许这样分配给数组中的多个元素。 您只能在初始化时执行此操作。 因此,创建一个新数组并使用这5个元素进行初始化,然后使用memcpy()
或memmove()
将其复制到目标位置
int[] tmp = {-7,-6,-5,-4,-3};
memcpy(cases[0].ques, tmp, 5*sizeof(int));
另外,您可以分别为ques[i]
分配值
希望您知道为什么cases[0].ques[5]
错误。
int arr[5] = {1,2,3,4,5};
上面的代码有效,因为您正在声明时对数组进行初始化。
如果你有
int arr[5];
arr[5] = {1,2,3,4,5}; // THIS WONT WORK
在这里,您必须使用for循环并填充每个索引。
还有,当你做
int arr[5];
arr[5] = {1,2,3,4,5};
在上面的代码中,您想要做的是将一些值放在arr [5]中。 那只是整个数组的一个索引。
另外,正如注释所建议的那样, arr[5]
是大小为5的数组中的第6个元素。现在,尽管它不会出错,但要准备得到一些意想不到的结果。 :)
cases[0].ques[5]={-7,-6,-5,-4,-3};
您无法执行此操作,此初始化程序仅在定义数组时有效。
您应该执行以下操作:
for (start = -7, i = 0; i < cases[0].len; i++, start++) {
cases[0].ques[i] = start;
}
很多时候我不使用C进行编程,但是我认为可以进行完整数组声明的唯一情况是在声明时:
int a[] = {...}
但不是这样:
int a[5];
a = {...};
另外,就您而言,您正在
int a[5] = {...}
这意味着您正在尝试将一个数组分配给一个整数。
另外,最好不要在malloc调用中进行强制转换 :
cases[0].ques = malloc(cases[counter].len * sizeof(int));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.