【问题标题】:Allocating 2-D array in C在 C 中分配二维数组
【发布时间】:2012-10-27 11:58:28
【问题描述】:

我想在运行时在 C 中分配一个二维数组。现在这可以通过像这样的传统方式来实现:

int *matrix[rows]
for (row = 0; row < rows; ++row) {
  matrix[row] = (int *)malloc(ncol*sizeof(int));
}

但我找到了另一种方法,它做同样的事情:

int (*p)[rows];
p=(int (*)[rows])malloc(rows*cols*sizeof(int));

谁能解释第二个声明的工作原理?具体来说,(int (*)[rows])malloc 是什么意思?据我所知,malloc 的用法与 (int *)malloc(ncol*sizeof(int))(char *)malloc(ncol*sizeof(char)) 类似。

【问题讨论】:

  • 第二个版本完全不同,因为rows 需要是一个编译时常量表达式。只有第一个版本是真正的“动态”。
  • 第一种情况rows也是编译时常量,你不能同时声明行数和列数,对吧?
  • @Cupidvogel in C 你不能动态声明它们中的任何一个
  • @icepack:在 C 中你有可变长度的数组。但是,不在 C++ 中。而且你没有变量 types.
  • @KerrekSB 对不起,你是对的。忘了C99

标签: c pointers malloc


【解决方案1】:

在这里,您将malloc 的返回值转换为类型指向rowsrows 数组的指针

顺便说一句,在 C 中,将指向 void 的指针转换为指向对象的指针不是必需的,甚至是无用的。您不必担心这些细节。下面的代码也确实有效。

#include <stdlib.h>

int (*p)[rows];
p = malloc(rows * cols * sizeof(int));

【讨论】:

    【解决方案2】:

    这些是不等价的,第一个分配一个指向整数的指针数组,第二个分配一个整数数组并返回一个指向它的指针,您只需分配几个彼此相邻的因此允许“数组”的第二维.

    如果您在函数结束后不需要数组,则更简单的版本是:

     int matrix[rows][cols];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-14
      • 1970-01-01
      • 2021-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-26
      相关资源
      最近更新 更多