使用malloc()创建二维数组

11 浏览
0 Comments

使用malloc()创建二维数组

我使用malloc()来创建一个二维数组来存储来自stdin的数据。在编写特定所需代码之前,我想先进行测试,以便对整体有一个大致的了解。我在网上找到了以下代码:\n

int r, c;
scanf("%d%d", &r, &c);
int *arr = (int *)malloc(r * c * sizeof(int));
int i, j, count = 0;
for (i = 0; i <  r; i++)
    for (j = 0; j < c; j++)
      *(arr + i*c + j) = ++count;
for (i = 0; i <  r; i++)
    for (j = 0; j < c; j++)
        printf("%d ", *(arr + i*c + j));

\n网上的代码中r和c的值是硬编码的,所以我将其改为了scanf,以使其与我后面所需的代码类似。它运行良好,但我不明白为什么我不能在我的代码中使用arr[i][j],而是使用*(arr + i *c +j)。当我尝试使用它时,出现了以下错误:\nerror: subscripted value is neither array nor pointer nor vector\n我原以为指针和数组是可以互换的,我错在哪里?

0
0 Comments

使用malloc()函数来创建二维数组的原因是,当arr是int *类型时,arr[i]是int类型。在上述代码中,malloc函数创建了一个一维向量,长度为r*c。*(arr + i*c + j)可以被翻译为arr[i*c + j]。这意味着这个向量被分为r个长度为c的片段,i选择片段,而j是片段内的偏移量。

解决方法是可以使用malloc函数来分配一个指针数组,然后为数组的每个指针分配内存。在这种情况下,你将会有一个int **类型的数组,并且你的方法将会有效,但是强烈不建议这样做,因为你需要释放指针数组中的所有指针。

0
0 Comments

使用malloc()为二维数组分配内存的原因是因为在代码中不能使用arr[i][j],这是因为arr指向的是int类型而不是int *或int[SOME_DIMENSION]类型。但是如果你想使用malloc()来创建一个真正的二维数组,你可以使用以下方法:

int (*arr)[c] = (int *)malloc(r * sizeof *arr);

现在,arr[i]的类型是int[c],它会衰减为int *,因此arr[i][j]是有效的。

在你的代码中,你正在分配一个变长数组,这在ISO C中是不允许的,这是为什么要使用malloc的第一个原因。

在发表这种荒谬的言论之前,也许你应该阅读一下ISO C标准。

对不起,我回到了已经过时的ISO C90。无论如何,这个问题是关于使用malloc的,使用变长数组可能会使问题毫无意义。

即使OP被限制在C89,我认为我的答案,特别是对于问题代码的C99+修复方法,阐明了问题片段中的类型错误以及正确的类型如何使其正常工作。顺便说一下,如果c恰好是一个常量表达式而不是一个变量,你也可以在C89中这样做。

0