在循环内进行第10次迭代后,Realloc失败

时间:2017-10-23 14:56:43

标签: c

我正在尝试从用户处获取一系列字母,并将输入放在动态数组中。

然而,从一个我无法弄清楚的原因 - 如果用户输入超过10个字母,则realloc失败(返回NULL并且“错误分配内存!”)。我确实尝试将realloc更改为calloc,这似乎解决了它,但我不确定原因。

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

int main (int argc, char **argv) {

    char *first_string, *second_string, *memory_check;
    char user_input;
    int first_string_size = 0, second_string_size = 0, debug =1;

    first_string = malloc(sizeof(char));
    second_string = malloc(sizeof(char));


    // gets the strings from the user

    printf("Input the first string:");

    for(int i = 0;;i++) {
        user_input= getchar();
        if(user_input == EOF || user_input == '\0' || user_input == '\n') {
            break;
        }
        first_string[i] = user_input;
        memory_check = realloc(first_string, (i+1)*(sizeof(char)));
        if(memory_check == NULL) {
            printf("\nError allocating memory!\n");
            break;
        }

        first_string_size = i;

        if(debug == 1) {
            printf("\n number of letters is %d", first_string_size +1);
            printf("\n array size in memory is %d", sizeof(first_string) * (i+1));
        }
    }

    return 0;
}

2 个答案:

答案 0 :(得分:3)

当然失败了:

memory_check = realloc(first_string, (i+1)*(sizeof(char)));
    if(memory_check == NULL) {
        printf("\nError allocating memory!\n");
        break;
    }

您使用memory_check作为标志来检查您是否可以重新分配,但不仅如此。

将其分配回first_string

在你的情况下,它是一个死的赠品:前10次(在你的情况下,当然,这没有指定或定义,它是纯随机的),内存区域不需要移动,这解释它有效。但过了一会儿,realloc无法重复使用相同的块(因为它太小)并且它会改变内存位置。

由于您没有更新它,因此会出现未定义的行为。

你可以这样做:

memory_check = realloc(first_string, (i+1)*(sizeof(char)));
if(memory_check == NULL) {
    printf("\nError allocating memory!\n");
    free(first_string);
    break;
}
first_string = memory_check;

答案 1 :(得分:2)

您正在写入已分配的内存。

memory_check是新重新分配的指针,您需要将此值与first_string进行交换。 first_string指向已经释放的内存(通过realloc)