如何在 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);
请注意,转换 malloc
s 结果在 C 中是 unnecessary。
你已经选对了 from Mr. Blue Moon。但是,为了澄清您案例中的错误,我想补充一点。
求代码
pascal = (int **) malloc(no_of_rows * sizeof(int));
看起来,您的 pascal
是 int **
类型,即指向指向 int
.
的指针
因此,在为 pascal
分配有效内存时,您需要分配等于它 指向 的元素的大小,并且它指向另一个 integer pointer
.
所以,你的分配语句应该是
pascal=malloc(no_of_rows * sizeof(int*));
注意事项:
- See why not to cast
malloc()
和家人的return值C
。
- 分配大小计算为
sizeof(int *)
(指向 int
的指针的大小)而不是 sizeof(int)
。
现在,为了使这个语句更健壮,我们可以(应该)将其重写为
pascal=malloc(no_of_rows * sizeof*pascal);
在这里,再次注意两件事,
sizeof
是一个运算符,它的操作数不需要括号,除非它是一个类型名称。
- 这条语句,与
pascal
的类型无关。即使改变了pascal
的类型,也不需要改变上面的语句
也就是说,在使用 returned 指针之前,请始终检查 malloc()
是否成功。
希望这对您有所帮助。
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);
请注意,转换 malloc
s 结果在 C 中是 unnecessary。
你已经选对了
求代码
pascal = (int **) malloc(no_of_rows * sizeof(int));
看起来,您的 pascal
是 int **
类型,即指向指向 int
.
因此,在为 pascal
分配有效内存时,您需要分配等于它 指向 的元素的大小,并且它指向另一个 integer pointer
.
所以,你的分配语句应该是
pascal=malloc(no_of_rows * sizeof(int*));
注意事项:
- See why not to cast
malloc()
和家人的return值C
。 - 分配大小计算为
sizeof(int *)
(指向int
的指针的大小)而不是sizeof(int)
。
现在,为了使这个语句更健壮,我们可以(应该)将其重写为
pascal=malloc(no_of_rows * sizeof*pascal);
在这里,再次注意两件事,
sizeof
是一个运算符,它的操作数不需要括号,除非它是一个类型名称。- 这条语句,与
pascal
的类型无关。即使改变了pascal
的类型,也不需要改变上面的语句
也就是说,在使用 returned 指针之前,请始终检查 malloc()
是否成功。
希望这对您有所帮助。