我需要分配相同类型和形状的几个数组。一开始,我做了类似的事情:
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故障。br>但是,在第一种情况下,您"可能"获得segfault并注意您的错误。
两者都是有效的,因为您使用malloc
来分配连续内存。实际上,当在c。
值得注意的是
int a1, a2, a3, a4;
int* a = &a1;
int oops = *(a + 1);
是不确定的行为,因为您不能期望堆栈分配是连续的。
它是完全有效的。
您的工作本质上与此相同:
void alloc_arrays_v1(size_t nmemb)
{
typedef int one_array[nmemb]; // this is one array
typedef one_array three_arrays[3]; // this are three arrays
one_array * a;
int *a1, *a2, *a3;
a = malloc(sizeof(three_arrays));
a1 = a[0]; // a[0] is a one_array, which decays into an int * here.
a2 = a[1]; // the same
a3 = a[2]; // as above
/* do some stuff with the arrays */
free(a);
}
差异是在这里通过指针和数组算术完成计算。