C:如果 malloc() 启动未定义的行为,则运行 realloc()

C: run realloc() if malloc() initiates undefined behavior

提问人:Abdullah Omar Nasseef 提问时间:1/1/2023 更新时间:1/1/2023 访问量:90

问:

我正在尝试在 C 中使用动态分配的字符串输入,这样一旦输入的字符串超过先前分配的内存,它就会重新分配内存,而不是进入未定义的行为realloc()

这是我的代码:


#include <stdio.h>

int main() {
    char *text, *retext;
    text = malloc(10 * sizeof(*text));
    scanf("%s", text);
    if(text == NULL) {
        printf("\nTry Again: ");
        retext = realloc(text, 20 * sizeof(*retext));
        scanf("%s", retext);
        printf("\n%s", retext);
        free(retext);
        retext = NULL;
    }
    printf("\n%s", text);
    free(text);
    text = NULL;
}

如果文本的长度超过 10(包括 \0),我基本上想运行 realloc()。我后来从许多 Stackoverflow 答案中了解到,malloc() 并没有真正返回 NULL,而是进入“未定义行为”,即使在超过 10chars 之后,一切似乎都可以正常工作。但是,我希望能够以某种方式“检测”malloc()何时开始此Undefined行为,并跳转到realloc()块而不是继续。我该如何实现?

c string malloc realloc

评论

0赞 user3386109 1/1/2023
您需要一次读取一个字符。getchar
1赞 Some programmer dude 1/1/2023
该函数不会也不能更改作为参数传递的指针。调用后的检查不会检测到输入问题。要检查是否有效,您需要检查返回的内容。但请注意,它无法检测到缓冲区溢出,结果仅指示格式是否可以匹配。scanftext == NULLscanfscanfscanfscanfscanf
1赞 Some programmer dude 1/1/2023
另请注意(以及所有其他输入函数)从输入中提取数据。除非输入流可以倒带(就像实际文件一样),否则字符将丢失。scanf
1赞 Carey Gregory 1/1/2023
我曾经和这个QA一起工作,他是程序员最糟糕的噩梦,但最终是他最好的朋友。如果我告诉他在我的程序中输入不超过 9 个字符,他会做的第一件事就是输入 200 个字符。你认为当那个 QA 人员在您的程序中输入 200 个字符时会发生什么?
2赞 n. m. could be an AI 1/1/2023
scanf("%s",你永远无法安全地使用它。

答:

1赞 Tudny 1/1/2023 #1

scanf读取字符串,直到它到达 \0 空格或输入末尾(感谢您的评论!),因此您需要实现函数来读取未知大小的字符串。逐字节。与 Java 不同,您无法在不通过输入的情况下从 stdin 中读取并检查它是什么。读取字节后,如果以后需要,您有责任记住它。

看一下:如何读取未知长度的输入字符串?

仅供参考:您可以指定要写入的缓冲区的长度:https://stackoverflow.com/a/12306624/7095554scanf

的返回值:scanf

RETURN VALUE         
       On success, these functions return the number of input items
       successfully matched and assigned; this can be fewer than
       provided for, or even zero, in the event of an early matching
       failure.

       The value EOF is returned if the end of input is reached before
       either the first successful conversion or a matching failure
       occurs.  EOF is also returned if a read error occurs, in which
       case the error indicator for the stream (see ferror(3)) is set,
       and errno is set to indicate the error.

来源: https://man7.org/linux/man-pages/man3/scanf.3.html#RETURN_VALUE

评论

0赞 Abdullah Omar Nasseef 1/2/2023
我有点理解你提供的所有资源,仍然在尝试研究一些东西,这样我就可以自然地获得所有的边缘情况。非常感谢您的帮助