几次迭代后C函数停止

时间:2018-12-19 16:35:06

标签: c arrays malloc

程序应该执行以下操作:编写一个doubleArray()函数,该函数接受输入数组int及其大小(作为指向int的指针)。在main()中:要求用户输入1到4之间的整数n,然后动态创建大小为n的数组。然后开始使用2048个随机生成的int填充数组:每次数组已满时,调用doubleArray函数;每次调用doubleArray函数时,都要打印数组的内容。

我的代码一直工作到数组n的大小达到250左右的数字,然后在for循环内停止。

mice

2 个答案:

答案 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