c - 动态分配二维数组并初始化它(段错误)

标签 c multidimensional-array dynamic-memory-allocation

我正在学习 C,我试图为一个二维数组分配内存(我从用户那里得到的数组的维度),但是我在尝试初始化它后遇到了段错误。我的代码是这样的:

#include <stdio.h>
#include <stdlib.h>

int main()
{
   printf("give the dimensions!\n");
   int row,col,i,j; 
   int **myArray;

   printf("\nrows = ");
   scanf("%d", &row);
   printf("columns = ");
   scanf("%d", &col);
   myArray = malloc(row*sizeof(*myArray) + col*sizeof(**myArray));

   printf("Init the array: \n");
   for (i = 0; i < row; i++)
   {
       for (j = 0; j <col ; j++)
       {
           scanf("%d", &myArray[i][j]);
       }
   }

   return 0;
}

如果我将数组更改为 myArray[2][2] 并省略 malloc 语句,它可以正常工作..

最佳答案

C 无法知道您的索引应该如何工作:没有将列数 (col) 与 myArray 相关联的信息。当您使用声明为 int * *myArray 执行 myArray[i][j] 时,C 将首先计算 myArray[i] ,即读取 myArray 的第 i:th 个值,就好像它是一个整数指针,但在您的情况下不是这样。然后它将根据该无效值索引 j,可能会产生段错误(至少会导致未定义的行为)。

像那样手动执行时,您有两种选择:

  • 将其设为“锯齿状”,其中每一行都有自己指向该行元素的指针。这就是@bgamlath 在 his answer 中的建议.
  • 自己进行索引,将 myArray[i][i] 替换为 myArray[i * cols + j]

后者使用更少的内存和(方式)更少的内存分配,这很好。当然,索引可能有点尴尬。

关于c - 动态分配二维数组并初始化它(段错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20676343/

相关文章:

c - sem_wait 在基本代码中不起作用

c - 使用/dev/kmem 从内核读取地址值

c - 为什么我无法存储函数的返回值?

c - 陷入 C 词典项目

c - 为什么 A[2][3] 对于声明 int *A [10] 是有效的左值;

python - NumPy:创建类似于 "repeat"的 bool 数组,但在多个维度中

swift - 在多部分 TableView 中使用 TextField 进行搜索 - Swift

c++ - 在 C++ 中调整动态堆栈分配的大小

c - 尝试填充动态数组时出现访问冲突(大量项目)

c - mpi_gather,c 中的二维动态数组,在信号 6 上退出(中止)