我正在编写一个使用整数数组的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 : '{'
你能帮帮我吗?
答案 0 :(得分:4)
这是无效的: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的评论更新:
您可以将临时数组中的所有值保留为int temp[50] = {...};
,然后在为ques
分配空格后,您可以使用memcpy
函数将len
个值复制到{{ 1}}。
答案 1 :(得分:4)
如果你有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()
的大小参数(第三个参数)。我躲过那个;重复复合文字似乎不是正确的举动,但手动计数也不是一个好的解决方案。
好吧,如果memmove()
不是一个反对给出7个参数而不是3个参数的宏(Mac OS X 10.9.2上的GCC 4.8.2),那么你可以!
(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()
,而不是宏。第二个通过在复合文字周围括起括号来创建一个参数。两者都编译。
请注意,虽然复合文字看起来像一个强制转换器和一个大括号初始化器,但我不确定它是一个严格的强制转换 - 最好不要将它视为一个强制转换而是一个复合文字。 / p>
顺便提一下,如果目标是将N个随机值添加到N个整数的数组中(如comment中提到的其他答案之一),那么您不会想要使用此技术 - 示例中的整数作为随机序列是不可信的。如果你确实需要在某个范围内的50个随机数,你将使用随机数生成器(可能是rand()
,可能
lrand48()
,可能还有别的东西)在适当的范围内创建值,使用简单的for
循环来初始化正确数量的数组元素。
答案 2 :(得分:3)
将值分配给每个数组元素,
cases[0].ques[0]=-7
cases[0].ques[1]=-6
...
cases[0].ques[5]=-3
因为您在声明后分配值。 C允许{}用于在声明时初始化数组。不是那之后。
答案 3 :(得分:1)
ques[5]
是int
,您无法为其分配数组
此外,C不允许像这样分配给数组中的多个元素。您只能在初始化中执行此操作。因此,创建一个新数组并使用这5个元素进行初始化,并使用memcpy()
或memmove()
int[] tmp = {-7,-6,-5,-4,-3};
memcpy(cases[0].ques, tmp, 5*sizeof(int));
或者,您可以单独为ques[i]
分配值
答案 4 :(得分:1)
我希望你意识到为什么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个元素。现在虽然它不会给出错误,但是要准备好得到一些意想不到的结果。 :)
答案 5 :(得分:0)
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;
}
答案 6 :(得分:0)
很多时候我不用C语言编程,但我认为你可以做一个完整的数组声明的唯一情况就是你声明它的时候:
int a[] = {...}
但不是这样:
int a[5];
a = {...};
另外,在你的情况下,你正在做
int a[5] = {...}
这意味着您正在尝试将数组分配给整数。
另外,如果你做not do a cast in the malloc call,情况会更好:
cases[0].ques = malloc(cases[counter].len * sizeof(int));