我需要用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()?谢谢。
答案 0 :(得分:4)
问题是您正在索引错误的数组。您应该撰写(*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
应该有不同的原型,例如
int *read(int *array_size);
因此它可以直接返回指向数组的指针,或者在出错时返回NULL。