【问题标题】:Initialize array of struct typedef in C?在C中初始化struct typedef数组?
【发布时间】:2014-03-16 19:42:28
【问题描述】:

所以,我对 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;
}

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

【问题讨论】:

  • 我对您的代码感到困惑。 MEM_SIZE 是什么?为什么不分配n * sizeof(MyObject)?你能显示MyObject的定义吗?
  • 不要投 mallocs.
  • 扩展@arshajii 所说的内容:Do I cast the result of malloc?
  • 强制转换 malloc 是无害的,但没有必要,因为它返回类型 void*,可以将其分配给任何指针而无需强制转换。
  • 我们需要struct的定义。 MyObject.memory 是什么?指针?

标签: c arrays pointers memory-management initialization


【解决方案1】:
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;
}

您需要为每个MyObject 分别分配一个char*。另外,每次分配后记得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);
...

【讨论】:

    猜你喜欢
    • 2021-09-21
    • 2017-07-21
    • 2014-02-02
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多