c - C在使用malloc时如何为2D(3D ...)数组分配空间?

标签 c malloc

我在理解 C 如何为 2D(或更多维)数组分配空间时遇到问题,尤其是当我们使用 malloc 等时。拿程序在this question例如。

首先定义一个一维指针数组,然后将指向一维数据数组(在本例中为字符串)的指针放入第一个一维数组的每个框中。所以不能保证整个二维数组是连续的(上一行的最后一个单元格后面是下一行的第一个单元格)。每个 1D 数据数组都可以很远,只有它们的指针是连续的。我是对的还是我错过了什么?如果您能帮我澄清一下,我将不胜感激。

最佳答案

有多种方法可以实现,具体取决于您将如何访问它。您可以确保数组的主体是连续的,也可以避免这种情况。对于字符串数组,您通常不会费心让数组的主体连续。对于整数或 double 的二维(等)数组,通常会使数组的主体连续。

在示例中,数组的数据类型是泛型类型 T,假定为数字,因此可以为数组元素分配 0。这些示例不会错误检查内存分配;他们应该在生产代码中。

使用计算索引进行数组访问——连续的数组主体

int n1 = 5;
int n2 = 6;

T *a = malloc(n1 * n2 * sizeof(T));

for (int i = 0; i < n1; i++)
    for (int j = 0; j < n2; j++)
        a[i * n2 + j] = 0;

free(a);

双下标数组访问——连续的数组体

int n1 = 5;
int n2 = 6;

T **a = malloc(n1 * sizeof(T*));
T  *b = malloc(n1 * n2 * sizeof(T));

for (int i = 0; i < n1; i++)
    a[i] = &b[i * n2];

for (int i = 0; i < n1; i++)
    for (int j = 0; j < n2; j++)
        a[i][j] = 0;

free(b);
free(a);

双下标数组访问——不连续的数组体

int n1 = 5;
int n2 = 6;

T **a = malloc(n1 * sizeof(T*));

for (int i = 0; i < n1; i++)
    a[i] = malloc(n2 * sizeof(T));

for (int i = 0; i < n1; i++)
    for (int j = 0; j < n2; j++)
        a[i][j] = 0;

for (int i = 0; i < n1; i++)
    free(a[i]);
free(a);

关于c - C在使用malloc时如何为2D(3D ...)数组分配空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17584215/

相关文章:

c - 如何一次性访问数组的多个元素?

c - 在 Struct 中动态分配二维数组(在 C 中)

c - 结构的 Malloc 成员数组

c - 在 C 中的结构数组中搜索

c - 为什么 uaccess.h 中的 access_ok 宏的实现没有使用它的所有参数?

c - Malloc 不创建内存

c++ - _CRTDBG_MAP_ALLOC 根本没有输出

C++ 3D vector 更新 malloc 不正确的校验和

c - C 中 0..7 的排列

c - C 中的 BOM 字节序