C-分配相同类型的几个阵列



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

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);
}

要避免多次调用mallocfree,我将上述内容更改为:

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

但是,我认为此代码中的一个合乎逻辑的问题是,如果您符合a1a2的界限,您将无法注意到它,因为您将访问有效的内存地址,即您将不会得到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);
}

差异是在这里通过指针和数组算术完成计算。

最新更新