【问题标题】:Dynamically allocated int Array in C input via terminal通过终端在 C 输入中动态分配的 int 数组
【发布时间】:2021-08-04 12:51:14
【问题描述】:

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

有时它会按预期工作,其他时候我得到:free(): double free detected in 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() 时的语句int indexToStore = size[0]-1;size 中的值是0,所以size[0]-1 变为0xFFFFFFFF (-1),所以indexToStore 变为-1。结果是语句中未定义的行为:ptr[indexToStore] = x; 此外,函数:output() 每次调用 input() 时都会被调用两次,这可能不是您想要的
  • 每次调用函数:input(),都会产生另一个内存泄漏。这是因为main() 中的指针array[] 永远不会更新,

标签: arrays c pointers dynamic


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2018-09-26
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    • 2016-10-29
    • 2018-03-05
    • 2012-04-20
    • 2017-10-12
    • 2011-01-08
    相关资源
    最近更新 更多