输入未知大小的整数数组

时间:2018-01-13 15:20:18

标签: c arrays realloc

我正在尝试创建一个未知大小的整数数组。 每次输入正元素时,我都会使用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;
        }

    }
}

2 个答案:

答案 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;
}
相关问题