我需要分配几个相同类型和形状的数组。一开始,我做了类似的事情:
void alloc_arrays_v1(size_t nmemb)
{
int *a1, *a2, *a3;
a1 = malloc(nmemb * sizeof int);
a2 = malloc(nmemb * sizeof int);
a3 = malloc(nmemb * sizeof int);
/* do some stuff with the arrays */
free(a1);
free(a2);
free(a3);
}
为了避免多次调用
malloc
和free
,我将以上内容更改为:void alloc_arrays_v2(size_t nmemb)
{
int *a, *a1, *a2, *a3;
a = malloc(3 * nmemb * sizeof int);
a1 = a;
a2 = a1 + nmemb;
a3 = a2 + nmemb;
/* do some stuff */
free(a);
}
这似乎可以(在实际情况下,函数的行为方式相同),但是我想知道这是否仍然是有效的C代码(未定义的行为?),并且是否可以将此方法扩展为复杂的数据种类(结构数组等)。
最佳答案
它在C语言中完全有效。但是请记住仅释放a
指针。您的这种方法类似于 struct hack
但是我认为这段代码中的一个逻辑问题是,如果您超出a1
或a2
的界限,您将无法注意到它,因为您将访问有效的内存地址,即您将不会遇到Seg Fault。
但是,在第一种情况下,您“可能”获得SegFault并注意到您的错误。
关于c - 分配几个相同类型的数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21475414/