使用malloc()创建二维数组
使用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我原以为指针和数组是可以互换的,我错在哪里?
使用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中这样做。