我正在为通过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
?最后,循环中的malloc
为sizeof 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
的所有成员初始化为零,这可以在一个操作(memset
或calloc
)中完成。如果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 */