在 C 语言中为矩阵分配内存,为什么之后我无法访问矩阵?



我正在使用 malloc为矩阵分配内存,但是之后我对矩阵进行任何访问以设置元素,例如,我会使我有分割错误。

这是我现在正在做的:

int **matrix = malloc(rows_number * columns_number * sizeof(int));
if (matrix) matrix[0][0] = 1;

创建矩阵为什么无法访问矩阵?malloc调用成功,因此我有足够的连续内存,以便整个矩阵。

这里的问题是您已经分配了存储器,但是您已将对象声明为指针的一组指针。双下标需要指向每行的指针向量,该类型告诉编译器有多少列。

所以有些选择是:

  • 使用代码进行下标计算,也许使用宏
  • 做两个mallocs()并初始化一个行指针向量
  • malloc是特定类型的对象,以便编译器可以看到它

例如...

int (*matrix)[ROWS][COLS] = malloc(ROWS * COLS * sizeof(int));
...
(*matrix)[i][j]

以下声明也将有效:

int (*matrix)[][COLS] = malloc(ROWS * COLS * sizeof(int));

int **matrixmatrix声明为指向int指针的指针。您想要一个指针到int的数组。这是int (*matrix)[columns_number]。您可以很好地分配:

int (*matrix)[columns_number] = malloc(rows_number * sizeof *matrix);

您已经为 int pointers 的动态数组分配了内存,而不是 int Elements 。您可以尝试这样的事情:

int *matrix_storage = malloc(rows_number * columns_number * sizeof(int));
int **matrix = malloc(rows_number * sizeof(int*));
for( int i = 0; i < rows_number; ++i )
    matrix[i] = &matrix_storage[ i * columns_number ];

malloc返回一个void指针,因此您尚未制作2维数组。尝试以下操作:

int **matrix;
matrix = malloc(rows_number * sizeof(int*));
for (int i=0; i<rows_number; i++)
    matrix[i] = (int*)malloc(columns_number * sizeof(int));

相关内容

  • 没有找到相关文章

最新更新