gpt4 book ai didi

c - 它有什么意义,为什么 sscanf 函数仍然有效?

转载 作者:行者123 更新时间:2023-12-02 06:13:25 25 4
gpt4 key购买 nike

如你所见,我在循环内只分配了 1 个字节作为 sizeof(char),而 sscanf() 仍然读取整个 block 直到空白进入string_of_letters。这怎么可能?

sscanf() 的定义是什么?

例如:str = "rony is a man" 但在 string_of_letters 位置 i 我看到“rony”。

char **string_of_letters;
int i;
char *read = str;

string_of_letters = (char**)malloc(3 * sizeof(char*));
for (i = 0; i < 3; i++) {
string_of_letters[i] = (char*)malloc(sizeof(char));
sscanf(read,"%[^, ]", &(*string_of_letters[i]));
printf("%s\n", string_of_letters[i]);
}

最佳答案

C 不会强制执行运行时内存边界检查,因此您只分配一个字节这一事实对 sscanf 的功能没有任何影响:它会很乐意尝试将整个字符串存储到内存中您提供的指针指向的位置。如果缓冲区不够大,结果是未定义的行为,其确切后果取决于太多需要考虑的因素(使用的编译器及其版本、操作系统、内存的当前状态等)。

在像您这样的小玩具程序中,它似乎可以正常工作也就不足为奇了,因为缓冲区足够小并且没有太多其他事情发生。然而,在一个更大的程序中,sscanf 很可能会覆盖传入的缓冲区的末尾并写入另一个缓冲区,分配给其他东西,改变你不想改变的内存,或者,例如,如果你很幸运,进入 protected 内存,导致访问冲突。

关于c - 它有什么意义,为什么 sscanf 函数仍然有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52029280/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com