如何将指向结构体的指针数组初始化为零



我正在为通过malloc结构的指针数组分配内存,并希望像下面提到的那样用零初始化它。假设结构包含类型int和char的成员[](字符串)?那么如何将这个结构体归零。

代码:假设我想分配100

struct A **a = NULL;
a = (struct **)malloc(sizeof( (*a) * 100);
for(i=1; i < 100; i++)
     a[i] = (struct A*)malloc(sizeof(a));

还请解释一下为什么必须用零初始化。

平台:Linux,编程语言:C

我知道我们可以使用memset或b0。我试过了,但它崩溃了,可能是我没有正确使用它,所以请告诉我正确的方法。

使用calloc最符合上面的例子。

首先,C数组是从零开始的,而不是从一开始的。接下来,您只分配了足够容纳一个指针的空间,但是您在其中存储了100个指针。您是尝试分配100个A,还是尝试分配100组每组100个A ?最后,循环中的mallocsizeof a而不是sizeof (struct A)分配空间。

我假设你正在尝试分配一个包含100个指针的数组给A,每个指针都指向一个A

解决方案:您可以使用calloc:
struct A **a;
/* In C, never cast malloc(). In C++, always cast malloc() */
a = malloc(100 * sizeof( (*a)));
for(i=0; i < 100; i++)
    a[i] = calloc(1, sizeof(struct A));

或者,您可以使用memset:

struct A **a;
a = malloc(100 * sizeof(*a));
for(i = 0; i < 100; i++) {
  a[i] = malloc(sizeof(struct A));
  memset(a[i], 0, sizeof(struct A));
}


你会问"为什么必须用零初始化?"它不是。相关的要求是:在第一次使用变量之前,必须为变量赋值或初始化变量。赋值或初始化可能是0,也可能是47"John Smith, Esq"。它必须是某个有效的赋值

为方便起见,您可以选择将struct A的所有成员初始化为零,这可以在一个操作(memsetcalloc)中完成。如果0对您来说不是一个有用的初始值,您可以手动初始化结构成员,例如:

struct A **a;
a = malloc(100 * sizeof(*a));
for(i = 0; i < 100; i++) {
  a[i] = malloc(sizeof(struct A));
  a[i]->index = i;
  a[i]->small_prime = 7;
  strcpy(a[i]->name, name_database[i]);
}

只要不引用未初始化和未赋值的变量的值,就可以。

您可以使用memset()将整个数组设置为0

OTOH,

a = (struct **)malloc(sizeof( (a*)));
for(i=1; i < 100; i++)
     a[i] = (struct*)malloc(sizeof(a) * 100);

是错误的,因为您刚刚创建了a *的一个元素,但是在下一行中,当循环进入第二次迭代时,它将访问非法内存。因此,要分配a *100元素,您的第一个malloc()应该如下所示

a = (struct **)malloc(sizeof(a *) * 100);
正确的代码(包括错误处理)大致如下:
if ((a = (struct **)malloc(sizeof(a*) * 100)) == NULL) {
    printf("unable to allocate memory n");
    return -1;
}
for(i=0; i<100; i++) {
    if ((a[i] = (struct*)malloc(sizeof(a) * 100)) == NULL) {
        printf("unable to allocate memory n");
        return -1;
    }
    memset(a[i], 0, 100);
}

或者作为malloc()memset()的替代,您可以使用calloc()

你不需要很多malloc,一个调用就足够了:

  int i;
  struct A **a = calloc(100,sizeof**a+sizeof*a),*mem=a+100;
  for(i=0;i<100;++i)
  {
    a[i]=&mem[i];
  }
  ...
  free(a);  /* and you only need ONE free */

最新更新