我有以下代码:
typedef struct Test {
long mem[1000];
} Test;
extern Test *test;
int main() {
Test *test = (Test *)malloc(sizeof(Test));
test->mem[0] = 1;
test->mem[1] = 2;
test->mem[2] = 3;
test->mem[3] = 4;
test->mem[4] = 5;
test->mem[5] = 6;
return 0;
}
它工作正常,但我想以这种方式改变mem数组的初始化:
test->mem = {1,2,3,4,5,6};
但是gcc给了我这个错误:
错误:'{'token test-> mem = {1,2,3,4,5,6}之前的预期表达式; 箭头指向左侧开括号。
它可以是什么?
谢谢!
修改 我也试试这段代码:
long mem[1000] = {1,2,3,4,5,6};
test->mem = mem;
我从gcc收到此错误:
错误:分配给'long int [1048576]'类型时出现不兼容的类型 来自类型'long int *'test-> mem = mem;
我不允许使用任何C函数。
答案 0 :(得分:10)
仅在初始化中允许使用语法something = { initial values }
,其中定义了对象,例如:
long mem[1000] = { 1, 2, 3, 4, 5, 6 };
x = value
这样的表达式是赋值,不能使用语法进行初始化。
另一种方法是创建一个初始化的临时对象,然后将该临时对象的内容复制到目标中:
static const long temporary[] = { 1, 2, 3, 4, 5, 6 };
memcpy(test->mem, temporary, sizeof temporary);
关于编辑:
可能未分配数组;如果x = value
是数组,则x
无效。但是,可以分配结构,因此另一种方法是将结构创建为临时对象,对其进行初始化并分配:
// (After the malloc is successful.)
static const Test temporary = { { 1, 2, 3, 4, 5, 6 } };
*test = temporary;
但请注意,此代码执行的先前代码没有。我前面的例子只展示了六个元素到数组中。此代码创建一个Test
类型的临时对象,其中包含1000个元素,其中大多数为零,并将所有这些元素复制到*test
。即使编译器对此进行优化并使用某些代码来清除*test
而不是实际复制存储在内存中的零,也需要比复制六个元素更长的时间。因此,如果您只想初始化一些元素并且不关心其余元素,请使用以前的代码。如果要将所有元素初始化(大多数为零),则可以使用后一个代码。 (即便如此,我会考虑替代方案,例如使用calloc
代替malloc
。)
答案 1 :(得分:2)
数组不是指针(但数组会衰减到指针,请参阅this),您无法分配数组(仅初始化它们,或指定{{ 1}} - 包含它们的s)。你可以复制数组,例如
struct
顺便说一下,您可以通过编码循环Test *test = (Test *)malloc(sizeof(Test));
if (!test) { perror("malloc"); exit(EXIT_FAILURE); };
static const int arr[] = {1,2,3,4,5,6};
memcpy (test->mem, arr, sizeof(arr));
而不使用memcpy
进行复制....
这使得for (int i=0; i<6; i++) test->mem[i] = arr[i];
中的9994个整数未初始化;你可能想要清除它们:
test
或使用其他memset (test->mem+6, 0, 9994*sizeof(int));
循环。
您还可以定义初始化结构,例如
for
然后分配它,例如
Test mystruct = {0, 2, 4, 6, 8};
但你无法分配数组!甚至
*test = mystruct;
不会编译。
FWIW,C++11有std::array来帮助解决这个问题。
C11标准的§6.5.16.1简单分配部分(参见n1570草案第102页)列出了一组有关分配和阵列分配的约束。适合那里。因此被禁止。一个经验法则是,只有标量(包括指针和数字l-values)或// wrong code, won't compile
int ta[4] = { 0, 1, 2, 3}; // initialization, not assignment
int tb[4] = { 2, 4, 6, 8}; // ditto
int *tp = &ta;
ta = tb; // wrong!
tb = tp; // also wrong
- s可以出现在作业的左侧(或struct
- 来自功能)。