每个循环扩展 1 个元素的数组 C

Expand array of 1 element every loop C

我必须让用户有多少他想要的输入和每个循环我需要扩展数组让其他人输入,当n=-1我需要结束循环。

这是我的代码:

void extend(int *a)
{
    int *pt;
    pt = (int*) realloc(a , sizeof(int));   
}

int main()
{
    int *a;
    a = (int*)malloc(sizeof(int));
    int i=0;
    int n=0;

    while(n!=-1) {
        scanf("%d", &n);
        if(n != -1) {
            a[i] = n;
            extend(a);
            i++;        
        }
    }       
    return 0;
}

它适用于 3 个值,然后它停止工作,我可以随意循环,但是当 n 变为 -1 时它崩溃了。我在某些编译器中出现 "invalid next size" 错误。

编辑:

此代码有效:

int main()
{
    int *a = (int*)malloc(0);
    int i=0;
    int n;

    do {
        scanf("%d", &n);
        if(n!=-1) {
            i++;
            a = (int*) realloc(a , i*sizeof(int));
            a[i-1] = n;   
        }
    } while(n!=-1);

    return 0;
}

最重要的错误是您没有将新的 realloc()ed 指针重新分配给以前的指针,而且您并没有真正改变大小。

试试这个

size_t extend(int **original, size_t oldsize)
{
    void *pointer;
    pointer = realloc(*original, (oldsize + 1) * sizeof(*original);
    if (poitner == NULL)
        return oldsize;
    *original = pointer;
    return oldsize + 1;
}

然后在 main()

size_t size;
int *data;
int number;

data = malloc(sizeof(int));
if (data == NULL)
    return -1;
size = 1;
while ((scanf("%d", &number) == 1) && (number != -1))
{
    data[size] = number;
    size = extend(data, size);
}

另请注意,

  1. 分配内存在 CPU 使用方面非常昂贵,因此您可能希望避免为每个元素都分配内存。也许定义一个 struct 来保存大小和容量( 估计可能有多少整数 ),当容量超过时 realloc() 来计算为此分配足够的 space 以防止 realloc() 再次过快。

  2. 始终检查 scanf() 的 return 值,否则您将最终调用未定义的行为并且您的程序将以未定义的方式运行。