C函数几次迭代后停止



程序应该执行此操作:编写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

相关内容

  • 没有找到相关文章

最新更新