在c中分配给struct中的数组

Nir*_*Nir 8 c arrays gcc struct

我有以下代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

它工作正常,但我想以这种方式改变mem数组的初始化:

test->mem = {1,2,3,4,5,6};
Run Code Online (Sandbox Code Playgroud)

但是gcc给了我这个错误:

错误:'{'token test-> mem = {1,2,3,4,5,6}之前的预期表达式; 用箭头指向左侧开括号.

它可以是什么?

谢谢!

编辑: 我也尝试这个代码:

long mem[1000] = {1,2,3,4,5,6};
    test->mem = mem;
Run Code Online (Sandbox Code Playgroud)

我从gcc得到这个错误:

错误:从类型'long int*'test-> mem = mem中分配类型'long int [1048576]'时出现不兼容的类型;

我不允许使用任何C函数.

Eri*_*hil 11

something = { initial values }仅在初始化时允许语法,其中定义了对象,例如:

long mem[1000] = { 1, 2, 3, 4, 5, 6 };
Run Code Online (Sandbox Code Playgroud)

例如表达x = value分配而不能使用的语法初始化.

另一种方法是创建一个初始化的临时对象,然后将该临时对象的内容复制到目标中:

static const long temporary[] = { 1, 2, 3, 4, 5, 6 };
memcpy(test->mem, temporary, sizeof temporary);
Run Code Online (Sandbox Code Playgroud)

关于编辑:

可能不会分配数组; x = value如果x是数组则无效.但是,可以分配结构,因此另一种方法是将结构创建为临时对象,对其进行初始化并分配:

// (After the malloc is successful.)
static const Test temporary = { { 1, 2, 3, 4, 5, 6 } };
*test = temporary;
Run Code Online (Sandbox Code Playgroud)

但是请注意,此代码执行的先前代码没有.我前面的例子只展示了六个元素到数组中.此代码创建一个类型的临时对象Test,其中包含1000个元素,其中大多数为零,并将所有这些元素复制到其中*test.即使编译器对此进行优化并使用一些代码来清除*test而不是实际复制存储在内存中的零,也需要比复制六个元素更长的时间.因此,如果您只想初始化一些元素并且不关心其余元素,请使用以前的代码.如果要将所有元素初始化(大多数为零),则可以使用后一个代码.(即便如此,我会考虑替代方案,比如使用calloc替代方案malloc.)