分配几个相同类型的数组

mic*_*yer 8 c arrays malloc

我需要分配几个相同类型和形状的数组.一开始,我做了类似的事情:

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);
}
Run Code Online (Sandbox Code Playgroud)

为了避免调用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);
}
Run Code Online (Sandbox Code Playgroud)

这似乎没问题(在某种意义上,函数在实际情况下的行为方式相同),但我想知道这是否仍然是有效的C代码(未定义的行为?),如果我可以将此方法扩展到复杂数据kind(结构数组等).

Don*_*ild 3

它在 C 中完全有效。但请记住仅释放a指针。你的这个方法类似于struct hack

然而,我认为这段代码中的一个逻辑问题是,如果你超出了范围,a1或者a2你将无法注意到它,因为你将访问有效的内存地址,即你不会得到段错误。
但是,在第一种情况下,您“可能”得到 SegFault 并注意到您的错误。