这是realloc()的正确用法吗?

-5 c malloc stdin realloc

我希望能够让用户输入他们想要做的事情.还有其他选择,但现在我正在研究"插入".另外两个选项是"搜索"和"删除".

int main() {

    char *input = malloc(sizeof(char) * 6);
    printf("%s", "WELCOME TO USER'S SKIP LIST!\n\nWhat do you wish to do? ");
    scanf("%6s", input);
    if (strcmp(input, "insert") == 0) {
        printf("%s", "What is the item? ");
        input = realloc(input, (size_t)scanf("%s", input));
    }
}
Run Code Online (Sandbox Code Playgroud)

我最初分配足够的内存,input有6个字符.这是因为其他两个选项也只有6个字符.进入后,他们insert必须输入一个具有任意数量字符的项目,因此我想input根据他们为项目输入的内容重新分配内存.因此,如果他们进入Nintendo Switch,将重新分配15个字符.我的执行realloc()方式是否正确?

Joh*_*ger 5

我想你主要问的是:

    input = realloc(input, (size_t)scanf("%s", input));
Run Code Online (Sandbox Code Playgroud)

不,这不是一个正确的使用realloc().仅此一行至少有四个明显的问题,包括:

  • scanf()返回成功扫描和记录的输入项数,或者EOF是否发生错误."输入项"对应于字段指令,例如您的%s,因此特定scanf()调用永远不会返回大于1的值.但是,它可能返回0或EOF(通常为-1).

  • 即使scanf()确实返回了读取的字符数,

    • 任何重新分配都为时已晚.数据存储在提供的空间中scanf(),如果空间不够大,则在重新分配任何机会之前,其边界将超出.

    • 没有为字符串终止符保留空格.

    • realloc()可能会失败,在这种情况下它会返回NULL.即使您通过检查input后检查realloc(),您将不再有指向原始空间的指针,因此它会泄漏.