通过终端在 C 输入中动态分配的 int 数组

Dynamically allocated int Array in C input via terminal

我是 C 的新手,我试图编写一个动态 int 数组,让用户通过终端输入数字,直到用户输入 -1。因此,用户可以键入任意数量的 int,并且每次输入另一个有效 int 时都会重新分配数据。

有时它按预期工作其他时候我得到:free(): tcache 2 中检测到双重释放 中止(核心转储) 错误。 我在每次输入后打印值,一切看起来都很好,直到输入 -1。而且这个bug每隔一段时间才会出现。

这是我的代码:

void output(int *ptr, int len){
    printf("\n");
    for(int i=0; i<len; i++){
        printf("%d %p \n", ptr[i], ptr+i);
    }

    printf("\n");
}

int input(int *ptr, int *size){

    int x;

    printf("Insert your numbers:\n");
    while(1){

        scanf("%d", &x);
        if(x == -1) break;

        size[0]++;
        // printf("Size: %d\n", size[0]);
        ptr = realloc(ptr, size[0] * sizeof(int));
        if(ptr == NULL) return -1;
        int indexToStore = size[0]-1;
        // printf("Index: %d\n", indexToStore);
        ptr[indexToStore] = x;
        output(ptr, size[0]);
    }
    return 0;
}


int main()
{
    int size = 0;
    int *array = (int*)malloc(sizeof(int));
    if(array == NULL) return -1;

    input(array, &size);
    output(array, size);
    input(array, &size);
    output(array, size);

    free(array); array = NULL;

    return 0;
}

函数 input 的参数 ptr 的副本 所传递和修改的内容不会影响调用方所传递的内容。

因此,从input()的第一次调用到input()的第二次调用,通过realloc()对缓冲区的更改不会保存,这会导致麻烦。

您应该传递一个指向应该修改的内容的指针,以使函数修改调用者的本地内容。

#include <stdio.h>
#include <stdlib.h>

void output(int *ptr, int len){
    printf("\n");
    for(int i=0; i<len; i++){
        printf("%d %p \n", ptr[i], ptr+i);
    }

    printf("\n");
}

int input(int **ptr, int *size){

    int x;

    printf("Insert your numbers:\n");
    while(1){

        scanf("%d", &x);
        if(x == -1) break;

        size[0]++;
        // printf("Size: %d\n", size[0]);
        *ptr = realloc(*ptr, size[0] * sizeof(int));
        if(*ptr == NULL) return -1;
        int indexToStore = size[0]-1;
        // printf("Index: %d\n", indexToStore);
        (*ptr)[indexToStore] = x;
        output(*ptr, size[0]);
    }
    return 0;
}


int main()
{
    int size = 0;
    int *array = (int*)malloc(sizeof(int));
    if(array == NULL) return -1;

    input(&array, &size);
    output(array, size);
    input(&array, &size);
    output(array, size);

    free(array); array = NULL;

    return 0;
}