Realloc在循环内的第10次迭代后失败

Realloc在循环内的第10次迭代后失败,c,C,我试图从用户那里获取一系列字母,并将输入放入一个动态数组中 然而,由于一个我无法完全理解的原因——如果用户输入的字母超过10个,realloc将失败(返回NULL并打印“错误分配内存!”)。我确实尝试将realloc更改为calloc,这似乎解决了问题,但我不知道为什么 #include <stdio.h> #include <stdlib.h> int main (int argc, char **argv) { char *first_string, *s

我试图从用户那里获取一系列字母,并将输入放入一个动态数组中

然而,由于一个我无法完全理解的原因——如果用户输入的字母超过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;
}
#包括
#包括
int main(int argc,字符**argv){
字符*第一个字符串,*第二个字符串,*内存检查;
字符用户输入;
int第一个字符串大小=0,第二个字符串大小=0,调试=1;
第一个字符串=malloc(sizeof(char));
第二个字符串=malloc(sizeof(char));
//从用户获取字符串
printf(“输入第一个字符串:”);
对于(int i=0;i++){
user_input=getchar();
如果(用户输入==EOF | |用户输入=='\0'| |用户输入=='\n'){
打破
}
第一个字符串[i]=用户输入;
内存检查=realloc(第一个字符串,(i+1)*(sizeof(char));
if(内存检查==NULL){
printf(“\n分配内存时出错!\n”);
打破
}
第一个字符串大小=i;
如果(调试==1){
printf(“\n字母数为%d”,第一个字符串大小+1);
printf(“\n内存中的数组大小为%d”,sizeof(第一个字符串)*(i+1));
}
}
返回0;
}
当然失败了:

memory_check = realloc(first_string, (i+1)*(sizeof(char)));
    if(memory_check == NULL) {
        printf("\nError allocating memory!\n");
        break;
    }
您正在使用
内存检查
作为一个标志来检查您是否可以重新分配内存,但不仅仅是这样

您必须将其分配回
第一个\u字符串

在你的情况下,这是一个死赠品:前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;
当然,它失败了:

memory_check = realloc(first_string, (i+1)*(sizeof(char)));
    if(memory_check == NULL) {
        printf("\nError allocating memory!\n");
        break;
    }
您正在使用
内存检查
作为一个标志来检查您是否可以重新分配内存,但不仅仅是这样

您必须将其分配回
第一个\u字符串

在你的情况下,这是一个死赠品:前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;

您正在写入解除分配的内存


memory\u check
是新重新分配的指针,您需要将此值与
第一个\u字符串
进行交换。第一个字符串指向现在已经被释放的内存(通过realloc)

您正在写入释放的内存


memory\u check
是新重新分配的指针,您需要将此值与
第一个\u字符串
进行交换。第一个字符串指向现在已被释放的内存(realloc)

尝试使用
peror
打印错误时,它会提供更多详细信息。将您的
printf(“Error alloc..
更改为
perror(“realloc”);
两个不相关的提示:1)增长量大于N+1,例如,当空间耗尽时,始终将大小增加一倍。2)sizeof(char)是。
memory\u check
是新重新分配的指针,您需要将此值与
first\u string
交换
first\u string
指向现在已被释放(realloc)的内存。打印错误时,尝试使用
peror
,它会提供更多详细信息。更改
printf(“错误alloc..
perror(“realloc”);
两个不相关的提示:1)增长量大于N+1,例如,当空间耗尽时,始终将大小加倍。2) sizeof(char)是。
memory\u check
是新重新分配的指针,您需要将此值与
第一个\u字符串进行交换<代码>第一个字符串
指向现在已被释放的内存(通过realloc)。