程序应该执行此操作:编写DoubleArray()函数,该功能输入INT数组及其大小(作为INT指针)。在主()中:请用户输入1到4之间的整数n,然后动态创建大小n的数组。然后开始用2048随机生成的int填充数组:每次阵列已满时,调用DoubleAraray函数;每次调用DoubleArray函数时,都会打印数组的内容。
我的代码工作直到数组n的大小达到250左右的数字,然后在for循环内停止。
#include<stdlib.h>
#include<stdio.h>
#include<time.h>
void doubleArray(int vect[], int *dim)
{
int n = *dim *2;
*dim = n;
vect = (int*)realloc(vect, n*sizeof(int));
}
void stampaArray(int vect[], int dim)
{
for (int i=0;i<dim;i++)
{
printf("%d ",vect[i]);
}
printf("n");
}
int main()
{
printf("Insert a number between 1 and 4: ");
int n;
scanf("%d",&n);
if ((n<1)||(n>4))
{
printf("Number not valid, try again: '");
scanf("%d",&n);
}
int *arr = (int*) malloc (n*sizeof(int));
srand(time(NULL));
int num;
for (int i=0;i<220;i++)
{
num = rand();
if (i==n)
{
doubleArray(arr, &n);
stampaArray(arr, n);
}
arr[i]=num;
}
stampaArray(arr,n);
return 0;
}
首先,更改此
if ((n<1)||(n>4)) { } /* use && instead of || to scan if n if both condition are true*/
to
//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
次?
正如您在评论中所说的那样,您的主要错误是允许Realloc更改指针值。如果发生这种情况,新值仅分配给doubleArray
函数内的本地副本,但是呼叫者仍然保留上一个值,该值现在是一个悬挂的指针(指向非分配的内存)。使用它调用未定义的行为(预计会发生崩溃...)
正确的方法是返回新的指针值:
int * doubleArray(int vect[], int *dim)
{
int n = *dim *2;
*dim = n;
return realloc(vect, n*sizeof(int));
}
那不是全部。最佳实践建议测试分配。在压力的环境中,系统可能无法分配足够的内存,而Realloc可能会返回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: '");
}
请,请不要用C语言施放malloc 。它没有用,很难隐藏以找到间接级别的错误。
最后,我不明白为什么您的循环最多可达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