动态分配内存以保存用户输入
dynamically allocating memory to save user input in it
我正在尝试编写这个简单的代码,它获取用户输入的消息,将其保存在堆栈中,然后将其显示给用户。
我不想限制用户可以输入的字符数,所以每次用户输入新字符时我都使用动态内存分配。
如果用户输入一个小号,代码运行良好。的字符,但如果用户输入一个大号,它就不起作用。字符数
例如:如果我输入“Ahmed”,它会返回给我,但如果我输入的字符更多,它就不会。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *UserInput;
UserInput=(char *)calloc(1,sizeof(char));
int i=0,ii=0;
printf("Enter a message! \n");
while(*(UserInput+ii)!='\n'){
scanf("%c",(UserInput+i));
ii=i;
i++;
UserInput=realloc(UserInput,i*sizeof(char));
}
for(i=0;i<=ii;i++){
printf("%c",*(UserInput+i));
}
return 0;
}
要在您的程序中进行适当的 运行 更改:
UserInput = realloc(UserInput, ((i + 1) * sizeof(char)));
解释:
当您接受 scanf 的输入时,您正在接收一系列字符(包括 '\n'
)。由于您的格式说明符是 %c
它应该只接受一个字符。输入的不是单个字符,而是字符序列。 %c
也不会过滤掉 '\n'
。多余的字符存储在 scanf 的缓冲区中。下次调用 scanf 时,它会从缓冲区中获取输入。
通过使用 calloc,您在开始时分配了 space 的 UserInput 1 字节,但是当您在每次迭代中调用 scanf 时,字符存储在第 UserInput + 1
个位置,其中有未通过 calloc 分配 给您的变量,但它仍在 calloc 的缓冲区中,即它仍未触及系统 memory/heap。你在迭代结束时 realloc消耗你的记忆力。也就是说,您正在使用未分配的内存,然后将其分配给 UserInput。
对于小字符序列,这不会给出任何错误,因为 calloc 的缓冲区不是那么小,但对于大字符序列,您将得到一个错误 - "corrupted size vs. prev_size" - 这是 heap attack/exploitation.
的指标
发生这种情况是因为 calloc 缓冲区现已耗尽,而您正在使用系统堆中的内存,这会使系统陷入疯狂。你在分配给你使用的范围之外修改内存,系统发现它的控制数据已经损坏,并且对此很不满意。
也别忘了free(UserInput);
普罗斯特!
我正在尝试编写这个简单的代码,它获取用户输入的消息,将其保存在堆栈中,然后将其显示给用户。
我不想限制用户可以输入的字符数,所以每次用户输入新字符时我都使用动态内存分配。
如果用户输入一个小号,代码运行良好。的字符,但如果用户输入一个大号,它就不起作用。字符数
例如:如果我输入“Ahmed”,它会返回给我,但如果我输入的字符更多,它就不会。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *UserInput;
UserInput=(char *)calloc(1,sizeof(char));
int i=0,ii=0;
printf("Enter a message! \n");
while(*(UserInput+ii)!='\n'){
scanf("%c",(UserInput+i));
ii=i;
i++;
UserInput=realloc(UserInput,i*sizeof(char));
}
for(i=0;i<=ii;i++){
printf("%c",*(UserInput+i));
}
return 0;
}
要在您的程序中进行适当的 运行 更改:
UserInput = realloc(UserInput, ((i + 1) * sizeof(char)));
解释:
当您接受 scanf 的输入时,您正在接收一系列字符(包括 '\n'
)。由于您的格式说明符是 %c
它应该只接受一个字符。输入的不是单个字符,而是字符序列。 %c
也不会过滤掉 '\n'
。多余的字符存储在 scanf 的缓冲区中。下次调用 scanf 时,它会从缓冲区中获取输入。
通过使用 calloc,您在开始时分配了 space 的 UserInput 1 字节,但是当您在每次迭代中调用 scanf 时,字符存储在第 UserInput + 1
个位置,其中有未通过 calloc 分配 给您的变量,但它仍在 calloc 的缓冲区中,即它仍未触及系统 memory/heap。你在迭代结束时 realloc消耗你的记忆力。也就是说,您正在使用未分配的内存,然后将其分配给 UserInput。
对于小字符序列,这不会给出任何错误,因为 calloc 的缓冲区不是那么小,但对于大字符序列,您将得到一个错误 - "corrupted size vs. prev_size" - 这是 heap attack/exploitation.
的指标发生这种情况是因为 calloc 缓冲区现已耗尽,而您正在使用系统堆中的内存,这会使系统陷入疯狂。你在分配给你使用的范围之外修改内存,系统发现它的控制数据已经损坏,并且对此很不满意。
也别忘了free(UserInput);
普罗斯特!