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我看不出有任何问题。你的回答很好:)