如何在 C 中为二维数组动态分配内存以避免堆栈溢出问题?

How do i dynamically allocate memory to a 2D array in C avoiding the stack overflow issue?

pascal = (int **) malloc(no_of_rows * sizeof(int));

for (i = 0; i < no_of_rows; i++)
{
    *(pascal + i) = (int*) malloc(col * sizeof(int));
}

谁能告诉我这段代码有什么问题,因为我是这种语言的初学者。我不断遇到 Stack Overflow 问题?可能的原因是什么,如何避免?

pascal=(int **)malloc(no_of_rows * sizeof(int));

应该是

pascal=malloc(no_of_rows * sizeof(int*));

请注意我额外添加的 *。总的来说,可以写的更好:

pascal=malloc(no_of_rows * sizeof *pascal);

请注意,转换 mallocs 结果在 C 中是 unnecessary

你已经选对了 from Mr. Blue Moon。但是,为了澄清您案例中的错误,我想补充一点。

求代码

pascal = (int **) malloc(no_of_rows * sizeof(int));

看起来,您的 pascalint ** 类型,即指向指向 int.

的指针

因此,在为 pascal 分配有效内存时,您需要分配等于它 指向 的元素的大小,并且它指向另一个 integer pointer.

所以,你的分配语句应该是

pascal=malloc(no_of_rows * sizeof(int*));

注意事项:

  1. See why not to castmalloc()和家人的return值C
  2. 分配大小计算为 sizeof(int *)(指向 int 的指针的大小)而不是 sizeof(int)

现在,为了使这个语句更健壮,我们可以(应该)将其重写为

pascal=malloc(no_of_rows * sizeof*pascal);

在这里,再次注意两件事,

  1. sizeof 是一个运算符,它的操作数不需要括号,除非它是一个类型名称。
  2. 这条语句,与pascal的类型无关。即使改变了pascal的类型,也不需要改变上面的语句

也就是说,在使用 returned 指针之前,请始终检查 malloc() 是否成功。

希望这对您有所帮助。