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