我需要使用 malloc 分配一个数组,并且我必须从输入中读取一些数字。这是我的代码:
#include <stdio.h>
#include <stdlib.h>
void read(int **array, int *array_size)
{
int *tmp;
int i;
scanf("%d", array_size);
*array=malloc(*array_size*sizeof(int));
tmp=malloc(*array_size*sizeof(int));
for(i=0;i<*array_size;i++)
{
scanf("%d", &tmp[i]);
array[i]=&tmp[i];
}
}
//DO NOT EDIT main()
int main()
{
int *array;
int array_size,i;
read(&array,&array_size);
printf("Print array:\n");
for(i=0;i<array_size;i++)
printf("%d\n", array[i]);
return 0;
}
它有点工作,但在显示值后它显示检测到堆栈崩溃(我用 GCC 编译它)。
我认为问题出在 *array=malloc(*array_size*sizeof(int))
上,但我不知道如何解决它。有没有另一种方法可以在不编辑 main() 的情况下分配这个数组?谢谢。
最佳答案
问题是您索引的错误 数组。你应该写 (*array)[i]
,而不是 array[i]
:
void read(int **array, int *array_size)
{
int *tmp;
int i;
scanf("%d", array_size);
*array=malloc(*array_size*sizeof(int));
tmp=malloc(*array_size*sizeof(int));
for(i=0;i<*array_size;i++)
{
scanf("%d", &tmp[i]);
(*array)[i]=tmp[i];
}
}
当然,所有这些都非常复杂 - 您不需要实际拥有那个 tmp
,也不需要 malloc
它。相反,你可以很好地做类似的事情
void read(int **array, int *array_size) {
int i, *pos;
scanf("%d", array_size);
*array = pos = malloc(*array_size * sizeof(int));
for (i = 0; i < *array_size; i ++, pos ++) {
scanf("%d", pos);
}
}
也就是说,我们有指针 pos
指向数组中我们要 scanf
下一个整数的当前位置。在每个循环中,我们都会增加位置。
当然,您希望检查这些scanf
和malloc
的返回值;也许 read
应该有一个不同的原型(prototype),例如
int *read(int *array_size);
因此它可以直接返回指向数组的指针,或者在出错时返回 NULL。
关于c - 指向指针数组的指针和 Stack Smashing 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45138527/