C++ 如何在C中为2D数组动态分配内存以避免堆栈溢出问题? pascal=(int**)malloc(无行数*sizeof(int)); for(i=0;i

C++ 如何在C中为2D数组动态分配内存以避免堆栈溢出问题? pascal=(int**)malloc(无行数*sizeof(int)); for(i=0;i,c++,c,pointers,dynamic,stack-overflow,C++,C,Pointers,Dynamic,Stack Overflow,有人能告诉我这段代码有什么问题吗,因为我是这门语言的初学者。我总是遇到堆栈溢出的问题?可能的原因是什么?如何避免 pascal = (int **) malloc(no_of_rows * sizeof(int)); for (i = 0; i < no_of_rows; i++) { *(pascal + i) = (int*) malloc(col * sizeof(int)); } 应该是 pascal=(int **)malloc(no_of_rows * sizeof

有人能告诉我这段代码有什么问题吗,因为我是这门语言的初学者。我总是遇到堆栈溢出的问题?可能的原因是什么?如何避免

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

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

pascal=(int **)malloc(no_of_rows * sizeof(int));
pascal = (int **) malloc(no_of_rows * sizeof(int));
请注意我添加的附加
*
。一般来说,你可以写得更好:

pascal=malloc(no_of_rows * sizeof(int*));
请注意,铸造
malloc
s的结果是C。

您已经从Mr.处获得了权利。然而,为了澄清您案例中的错误,我想补充一个细节

对于代码

pascal=malloc(no_of_rows * sizeof *pascal);
看起来,您的
pascal
属于
int**
类型,即指向-
int
的指针

因此,在为
pascal
分配有效内存时,您需要分配与它所指向的元素相等的大小,并且它指向另一个
整数指针

所以,你的分配声明应该是

pascal = (int **) malloc(no_of_rows * sizeof(int));
注意事项:

  • malloc()
    C
    中的族的返回值
  • 分配大小计算为
    sizeof(int*)
    (指向
    int
    的指针大小),而不是
    sizeof(int)
  • 现在,为了使这个语句更加健壮,我们可以(应该)将其重新编写为

    pascal=malloc(no_of_rows * sizeof(int*));
    
    这里,再一次,要注意两件事

  • sizeof
    是一个运算符,除非它是一个类型名,否则它的操作数周围不需要括号
  • 此语句独立于
    pascal
    的类型。即使更改了
    pascal
    的类型,也不需要更改上述语句
  • 也就是说,在使用返回的指针之前,请始终检查
    malloc()
    是否成功


    希望这有帮助。

    请使用一些空格。你这么讨厌你的读者吗?删除强制转换,同时更改
    malloc(无行*sizeof(int))
    malloc(无行*大小(int*)。此外,请检查那些
    malloc
    的返回值,以避免出现错误,例如
    sizeof(int)
    而不是
    sizeof(int*)
    ,并保持代码易于更改,您应该编写
    p=malloc(事物的数量*sizeof(*p))请选择两种不同的语言:C或C++。我实际上倾向于强烈地限制铸造<代码> Vux*<代码>(C)。不错。然而,我想添加一个详细说明作为答案,你能回顾一下吗?@SouravGhosh我看不出有任何问题。你的回答很好:)