我正在尝试创建一个未知大小的整数数组。 每次输入正元素时,我都会使用realloc来增加数组的大小并存储该元素 问题是,当我运行此代码时,我在函数create1DArray的while迭代后得到运行时错误,因此可能是由于realloc失败。 任何人都可以告诉我我做错了什么以及如何解决它? 提前谢谢,
#include <stdio.h>
#include <stdlib.h>
void create1DArray(int** perArray, int* size);
int main()
{
int *perArray, size=0, i;
create1DArray(&perArray, &size );
for(i=0; i<size; i++)
printf("%d ",perArray[i]);
free(perArray);
return 0;
}
void create1DArray(int** perArray, int* size)
{
int flag=0, i=0, x;
*perArray=(int*)malloc(sizeof(int) );
if(*perArray==NULL)
{
printf("Allocation failed!");
exit(1);
}
while(!flag)
{
if( scanf("%d", &x)<1 || (x<0) )
{
printf("Invalid input!");
free(perArray);
exit(1);
}
if(!x)
{
if( !(*size) )
{
printf("The first element of the array must not be 0");
free(perArray);
exit(1);
}
flag++;
}
else
{
*perArray=(int*)realloc(*perArray, (++(*size))*sizeof(int) );
if(*perArray==NULL)
{
printf("Reallocation failed!");
free(perArray);
exit(1);
}
*perArray[i++]=x;
}
}
}
答案 0 :(得分:1)
我想我看到了两个问题(而且M Oehm再发现一个问题):
1)你对尺寸的处理是错误的(或者至少是奇怪的)。通常你会做类似的事情:
*perArray=(int*)malloc(sizeof(int) );
*size = 1;
或许更好 - 您应该删除malloc
并将main
中的指针初始化为NULL。当使用NULL调用realloc
时,malloc
就像realloc
一样。
这也允许你多次调用该函数 - 这是你当前代码不允许的。
2)您的 *perArray=(int*)realloc(perArray, (++(*size))*sizeof(int) );
^^^^
Should be *perArray
*perArray[i++]=x; ---> (*perArray)[i++]=x;
3)你需要在索引之前取消引用指针(M Oehm注意到 - 谢谢)。
for entry in `find . -type f`; do
echo $entry
done
答案 1 :(得分:0)
可能不完全是你想要的,但看看它是如何简洁地完成的(尽管在每次迭代时执行realloc效率很低)。它应该使用标志 std = c11 编译。
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int main()
{
int size = 0;
int input = 0;
int * perArray = NULL;
while(scanf("%d", &input) && input > 0)
{
++size;
perArray = (int *) realloc(perArray, sizeof(int) * (long unsigned) size);
assert(perArray);
perArray[size - 1] = input;
}
if(perArray)
{
for(int i = 0; i < size; ++i) printf("%d ", perArray[i]);
printf("\n");
free(perArray);
}
return 0;
}