程序应该执行以下操作:编写一个doubleArray()函数,该函数接受输入数组int及其大小(作为指向int的指针)。在main()中:要求用户输入1到4之间的整数n,然后动态创建大小为n的数组。然后开始使用2048个随机生成的int填充数组:每次数组已满时,调用doubleArray函数;每次调用doubleArray函数时,都要打印数组的内容。
我的代码一直工作到数组n的大小达到250左右的数字,然后在for循环内停止。
mice
答案 0 :(得分:0)
首先,更改此
if ((n<1)||(n>4)) { } /* use && instead of || to scan if n if both condition are true*/
到
//scanf("%d",&n); /*remove this, use only once, in below loop */
while(1) {
scanf("%d",&n);
if ((n>=1) && (n<=4)) {
break;
}
else {
printf("Number not valid, try again: '");
}
}
并分配等于n
字节的内存。例如
int *arr = malloc (n * sizeof(*arr)); /* typecasting is not required */
也在这里
for (int i=0;i<220;i++) { /* some code */ }
旋转循环220
次之后的原理是什么,不是应该n
次吗?
答案 1 :(得分:0)
正如您在评论中所说,您的主要错误是允许realloc更改指针值。如果发生这种情况,则仅将新值分配给doubleArray
函数中的本地副本,但调用方仍保留先前的值,该值现在是一个悬空指针(指向未分配的内存)。使用它会调用未定义的行为(并且可能会导致崩溃...)
正确的方法是返回新的指针值:
int * doubleArray(int vect[], int *dim)
{
int n = *dim *2;
*dim = n;
return realloc(vect, n*sizeof(int));
}
那还不是全部。最佳做法建议测试分配。在紧张的环境中,系统可能无法分配足够的内存,而重新分配可能会返回NULL。然后,程序还将涉及未定义的行为。
让我们继续。控制输入很不错,但是用户可以输入两次错误,因此您应该循环执行,直到获得正确的值为止:
int n;
for (;;) {
printf("Insert a number between 1 and 4: ");
scanf("%d",&n);
if ((n >= 1) && (n <= 4)) break;
printf("Number not valid, try again: '");
}
然后,请 do not cast malloc in C language 。它是无用的,并且很难隐藏以发现间接级别的错误。
最后,我不明白为什么循环多达220个。根据您的要求,循环数应最大为2048个。
最后一点(但这只是我的看法,不是问题):我只会显示数组的初始化内容,因此最多显示i
而不是n
。这样一来,您将看到数组不断增长,同时始终保持相同(初始化)的值:
int *arr = malloc (n*sizeof(int));
srand(time(NULL));
int num;
for (int i=0;i<2048;i++)
{
num = rand();
if (i==n)
{
arr = doubleArray(arr, &n);
if (arr == NULL) {
perror("allocation error");
return 1;
}
stampaArray(arr, i);
printf("\n");
}
arr[i]=num;
}
stampaArray(arr,2048);
free(arr); // not required immediately before a return but good practice