所以,我对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;
}
当我尝试运行已编译的程序时,我仍然遇到分段错误,即使我尝试仅使用单个对象运行它,并且不确定它是否完全误解了我想要做什么或者某些事情简单。
答案 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);
...