提问人:Abdullah Omar Nasseef 提问时间:1/1/2023 更新时间:1/1/2023 访问量:90
C:如果 malloc() 启动未定义的行为,则运行 realloc()
C: run realloc() if malloc() initiates undefined behavior
问:
我正在尝试在 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()块而不是继续。我该如何实现?
答:
1赞
Tudny
1/1/2023
#1
scanf
读取字符串,直到它到达 空格或输入末尾(感谢您的评论!),因此您需要实现函数来读取未知大小的字符串。逐字节。与 Java 不同,您无法在不通过输入的情况下从 stdin 中读取并检查它是什么。读取字节后,如果以后需要,您有责任记住它。\0
看一下:如何读取未知长度的输入字符串?
仅供参考:您可以指定要写入的缓冲区的长度: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
我有点理解你提供的所有资源,仍然在尝试研究一些东西,这样我就可以自然地获得所有的边缘情况。非常感谢您的帮助
评论
getchar
scanf
text == NULL
scanf
scanf
scanf
scanf
scanf
scanf
scanf("%s",
你永远无法安全地使用它。