【发布时间】:2021-07-06 15:15:10
【问题描述】:
我创建了这个简单的程序,它接受 3 名员工的意见。首先,它询问员工 id 的大小。然后它动态地将大小分配给字符数组。假设我给数组的大小为 4。在这里,我知道我们可以输入 3 个字符,因为最后一个字符是 '\0'。但是,在运行时,我可以输入比我最初假设的更多的字符。为什么会这样?预计会出错吗?
代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int input;
char *ptr;
for (int i = 1; i <= 3; i++)
{
printf("\nEmployee %d\n", i);
printf(" Enter the number of characters in your eID: ");
scanf("%d", &input);
ptr = (char *)malloc((input + 1) * sizeof(char));
printf(" Enter your eID: ");
scanf("%s", ptr);
printf(" Employee eID entered: %s", ptr);
free(ptr);
}
return 0;
}
输出:
Employee 1
Enter the number of characters in your eID: 4
Enter your eID: 12345
Employee eID entered: 12345
Employee 2
Enter the number of characters in your eID: 3
Enter your eID: 1234
Employee eID entered: 1234
Employee 3
Enter the number of characters in your eID: 2
Enter your eID: 123
Employee eID entered: 123
【问题讨论】:
-
预计您不会收到错误消息。 预计会发生奇怪的事情——如果不是现在,那么最终。一个真实的事实是,向 malloc'ed 区域写入的内容超出指定的大小是错误的。如果您没有立即收到错误消息或失败,这并不意味着真实的事实在某种程度上不正确。
-
超出缓冲区大小是 C 中调用 undefined behavior 的众多方法之一。该行为是未定义的,这意味着一切似乎都可以正常工作,它可能会出现在段错误中,它可能会在一段时间后表现出奇怪的行为,它现在可能对您有用,但不适用于另一台机器或使用不同的编译器标志。目的是编写定义明确的程序,而不是试图理解或解释 UB 在您的特定实例中的行为。
-
仅供参考,这是在 C 中调用 UB 的全面(尽管可能并不详尽)列表...溢出内存缓冲区,正如您在 #14 处看到的那样:wikiod.com/w/C_Undefined_behavior跨度>
标签: c