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

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);

普罗斯特!