我试图编写这个简单的代码,该代码接收用户输入消息并将其保存在堆栈中,然后将其显示给他。 我不想限制用户可以输入的字符数,因此每次用户输入新字符时都会使用动态内存分配。
如果用户输入了小号,代码运行良好。字符,但如果用户键入一个大字号,它不起作用。字符
例如:如果我进入了#34; 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;
}
答案 0 :(得分:1)
要在程序中进行更改才能正常运行:
-z follow
说明:
当您接受scanf的输入时,您将接受一系列字符(包括UserInput = realloc(UserInput, ((i + 1) * sizeof(char)));
)。由于您的格式说明符为'\n'
,因此它应该仅包含一个字符。输入不是单个字符,而是字符序列。此外,%c
也不会过滤掉%c
。额外的字符存储在scanf的缓冲区中。下次调用scanf时,它会从缓冲区中获取输入。
通过calloc,您在开始时分配UserInput 1字节的空格,但是当您在每次迭代中调用scanf时,该字符存储在'\n'
位置,其中尚未分配强>你的变量由calloc,但仍然在calloc的缓冲区,即它仍然没有触及系统内存/堆。在迭代结束时你是realloc的记忆。即您正在使用未分配的内存,然后将其分配给UserInput。
对于小字符序列,这不会给出任何错误,因为calloc的缓冲区不是那么小,但是对于大字符序列,你会收到错误 - “corrupted size vs prev_size” - 是heap attack/exploitation.
的指标这是因为calloc缓冲区现在已经耗尽,而您正在使用系统堆中的内存,这会将系统发送到疯狂状态。您修改了分配给您使用的范围之外的内存,系统发现其控制数据已损坏,并且对此不满意。
也不要忘记UserInput + 1
普罗斯特!