【问题标题】:sscanf copying data more than variable sizesscanf 复制数据超过可变大小
【发布时间】:2014-10-13 20:18:43
【问题描述】:

我在代码下方运行并尝试使用 sscanf 复制数据。

#include<stdio.h>
int main()
{
char str[25]="";
char* str2="1234567890123456789012345678901234567";
sscanf(str2,"%s",str);
printf("str =%s,\nstr2=%s,\nsizeof(str)=%d",str,str2,sizeof(str));
return 0;
}

下面是我得到的输出:

str =1234567890123456789012345678901234567,
str2=1234567890123456789012345678901234567,
sizeof(str)=25

谁能帮我解释一下为什么 str 存储的数据超过了它的大小。

gcc 版本 4.8.3

提前致谢。

【问题讨论】:

    标签: c linux scanf


    【解决方案1】:

    C 语言不检查数组的大小。这取决于你。当您将 str2 复制到 str 中时,您正在“入侵”不属于 str 的内存空间。第 25 个字符之后发生的情况未定义。 (幸运的是它还没有被修改,因为它是一个简短的程序,但不要指望它!)

    【讨论】:

      【解决方案2】:

      str 只能容纳 25 个字符。您试图将超过 25 个字符复制到其中。这会导致未定义的行为。

      在 C 中,您有责任确保只写入已分配的内存。如果您不遵守规则,则无法保证。

      您可以通过使用格式字符串"%24s"sscanf 来修复此代码。

      【讨论】:

        【解决方案3】:

        尝试使 str2 更长一点。我将它再扩展了 20 位,得到了一个核心转储,这是意料之中的。

        您“成功”的原因是编译器可能将您的值存储在某个 2^n 基础上以提高效率,因此您获得了一些您没有要求的额外字节。

        【讨论】:

          猜你喜欢
          • 2015-02-04
          • 2020-03-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-31
          相关资源
          最近更新 更多