Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 语法错误:';{';_C_Arrays_Pointers - Fatal编程技术网

C 语法错误:';{';

C 语法错误:';{';,c,arrays,pointers,C,Arrays,Pointers,我正在编写一个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 st

我正在编写一个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));
cases[0].ques[5]={-7,-6,-5,-4,-3};
之后,我尝试按如下方式填写数组
ques

cases[0].ques=(int *)malloc(cases[counter].len*sizeof(int));
cases[0].ques[5]={-7,-6,-5,-4,-3};
在编译时,我在上面的一行中得到一个错误,指出:

maxmin.c(47) : error C2059: syntax error : '{'

你能帮我一下吗?

这是无效的:
案例[0]。问题[5]={-7,-6,-5,-4,-3};

您可以用这种方式在C中初始化数组,仅在声明数组时

要在C程序中填充此时的值,应使用
for
循环分别填充每个索引

现在,C编译器将此语句解析为:

数组
ques
的索引
5
在结构数组
cases
的索引
0
类型
struct test
的索引
5
的值是
{-7,-6,-5,-4,-3}
,这当然是无效的,因为在为变量赋值时不能使用
{/code>

在OP的评论中更新:


您可以保留temp数组中的所有值,例如
int temp[50]={…};
然后在为
ques
分配空间后,您可以使用
memcpy
函数将
len
值的数量复制到
ques

为每个数组元素赋值,如下所示:

cases[0].ques[0]=-7
cases[0].ques[1]=-6
...
cases[0].ques[5]=-3

由于您是在声明后赋值。C允许{}在声明时用于初始化数组。而不是在声明之后。

ques[5]
是一个
int
,因此您不能为它赋值数组

另外,C不允许这样分配给数组中的多个元素。您只能在初始化时执行。因此,请创建一个新数组并使用这5个元素初始化,然后使用
memcpy()
memmove()

或者,您可以分别为
ques[i]
赋值

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;
}
for(start=-7,i=0;i
如果您有C99或C11,可以将复合文字与
memcpy()
memmove()
结合使用来初始化新数组:

memmove(&cases[0].ques, (int []){-7,-6,-5,-4,-3}, 5 * sizeof(int));
这也解决了分配
案例[0]的问题。ques
作为指向5个整数的指针,但随后尝试分配给超出分配数组末尾的单个元素。代码也不一致,因为大多数代码引用
案例[0]
,但
malloc()
调用引用
案例[count]
在参数列表中。并非自动错误,但肯定不寻常

数组字面值可以根据需要任意大。唯一棘手的是
memmove()
的size参数(第三个参数)。我很快就躲开了;重复复合字面值感觉不是正确的移动,但手动计数也不是一个好的解决方案

好吧,如果
memmove()
不是一个反对使用7个参数而不是3个参数的宏(Mac OS X 10.9.2上的GCC 4.8.2),那么您可以这样做

第一个函数调用函数
memmove()
,而不是宏。第二个函数通过在复合文本周围加括号来创建单个参数。这两个函数都可以编译


请注意,尽管复合文字看起来像一个cast和一个大括号初始值设定项,但我不确定它是否严格是一个cast-最好不要将其视为一个cast,而是一个复合文字

顺便说一句,如果目标是将N个随机值添加到N个整数的数组中(如a中提到的,添加到其他答案之一),那么您将不想使用此技术-示例中的整数不可能是随机序列。如果您确实希望在某个范围内添加50个随机数,则将使用随机数生成器(可能,可能
,可能是其他内容)来创建适当范围内的值,使用一个简单的
for
循环来初始化正确数量的数组元素。

很多时候我不使用C编程,但我认为唯一可以进行完整数组声明的情况是在声明时:

int a[] = {...}
但不是这样:

int a[5];
a = {...};
而且,在你的情况下,你正在做

int a[5] = {...}
这意味着您正试图将一个数组分配给一个整数

此外,如果您这样做,效果会更好:


我希望您了解为什么
案例[0]。问题[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个元素。现在,虽然它不会给出错误,但要准备得到一些意外的结果。:)

谢谢你,先生。有没有办法初始化一个有很多整数的数组,比如说50个整数?我必须静态地给出值,这样我就不能使用for循环。@user3153983 MadHatter的更新提到了
memcpy
,这是最明智的答案。如果你觉得这个答案有用,你应该接受它。谢谢你,先生/女士。是吗初始化一个有许多整数的数组的方法,比如说大约50个?我必须静态地给出值,这样我就不能使用for循环。上面提到的方法似乎很乏味。@user3153983你是如何得到这50个值的?有什么逻辑吗?@user3153983好的。你是如何得到这50个值的?从用户输入中还是从你如何得到这些值的?亲爱的,我的array必须有完全随机的值。这是为了测试一个程序。所以我想我必须分配每个单独的元素
int arr[5];
arr[5] = {1,2,3,4,5};