动态分配内存以保存用户输入

时间:2017-09-23 04:27:57

标签: c pointers dynamic-memory-allocation realloc

我试图编写这个简单的代码,该代码接收用户输入消息并将其保存在堆栈中,然后将其显示给他。 我不想限制用户可以输入的字符数,因此每次用户输入新字符时都会使用动态内存分配。

如果用户输入了小号,代码运行良好。字符,但如果用户键入一个大字号,它不起作用。字符

例如:如果我进入了#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;
}

1 个答案:

答案 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

普罗斯特!