在C中初始化struct typedef的数组?

时间:2014-03-16 19:42:29

标签: c arrays pointers memory-management initialization

所以,我对C很缺乏经验并且遇到了麻烦。

我必须初始化一定数量的对象,并在每个对象中初始化两个变量。我有预先编写的代码,可以编译并运行单个对象。

我最初转换了一行:

MyObject object;

MyObject object[n]; //where n = # of objects needed

我改变了其他类似的行,例如:

mem = (unsigned char *)malloc( MEM_SIZE);
...
memset( &object, 0, sizeof(MyObect));
object.memory = mem;

mem = (unsigned char *)malloc(MAX_MEM_SIZE + (n*sizeof(MyObject)));
...
for( i = 0; i < n; i++){
    memset( &object[i], 0, sizeof(MyObect));
    object[i].memory = mem;
    object[i].var1 = i;
    object[i].var2 = n;
}

当我尝试运行已编译的程序时,我仍然遇到分段错误,即使我尝试仅使用单个对象运行它,并且不确定它是否完全误解了我想要做什么或者某些事情简单。

1 个答案:

答案 0 :(得分:0)

MyObject object[n];
for( i = 0; i < n; i++){
    char *mem = malloc(MEM_SIZE);
    memset( &object[i], 0, sizeof(MyObject));
    object[i].memory = mem;
    object[i].var1 = i;
    object[i].var2 = n;
}

您需要分别为每char*分配一个MyObject。此外,请记住之后free()每个分配。

或者,你可以malloc()一个大的缓冲区并手动将部分缓冲区分配给MyObjects

MyObject object[n];
mem = malloc(MEM_SIZE*n);
for( i = 0; i < n; i++){
    memset( &object[i], 0, sizeof(MyObject));
    object[i].memory = mem+n*MEM_SIZE;
    object[i].var1 = i;
    object[i].var2 = n;
}

但是你必须要小心,只有free(object[0].mem),并且只有在不再使用所有对象之后才会这样做。

无论哪种方式,你都可以将memset()提升出来:

MyObject object[n];
memset(object,0,sizeof(MyObject)*n);
...