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

Arrays 通过终端在C输入中动态分配int数组,arrays,c,pointers,dynamic,Arrays,C,Pointers,Dynamic,我是C新手,我试图编写一个动态int数组,让用户通过终端键入数字,直到用户键入-1为止。因此,用户可以键入任意数量的int,并且每次输入另一个有效的int时都会重新分配数据 有时它会像预期的那样工作,其他时候我得到:free():在TCache2中检测到双重空闲 中止(堆芯转储)错误。 每次输入后我都会打印这些值,直到输入-1为止,一切都很好。这个错误只会每隔一段时间出现一次 这是我的密码: void output(int *ptr, int len){ printf("\n&

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

有时它会像预期的那样工作,其他时候我得到:free():在TCache2中检测到双重空闲 中止(堆芯转储)错误。 每次输入后我都会打印这些值,直到输入-1为止,一切都很好。这个错误只会每隔一段时间出现一次

这是我的密码:

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;
}

void输出(int*ptr,int len){
printf(“\n”);

对于(int i=0;i函数
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;
}
#包括
#包括
无效输出(int*ptr,int len){
printf(“\n”);

对于(int i=0;i在第一次调用
input()
时调用语句
int indextore=size[0]-1;
时,
size
中的值为0,因此
size[0]-1
变为0xffffff(-1)所以
indextore
变为-1。结果是语句中未定义的行为:
ptr[indextore]=x;
此外,函数:
output()
在每次调用
input()
时被调用两次,这可能不是每次调用函数:
input()
时所希望的,会创建另一个内存泄漏。这是因为
main()
中的指针
数组[]
从未更新,