繁体   English   中英

语法错误:“ {”

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM