我正在尝试从用户处获取一系列字母,并将输入放在动态数组中。
然而,从一个我无法弄清楚的原因 - 如果用户输入超过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;
}
答案 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)