sscanf复制数据超过可变大小

时间:2014-10-13 20:18:43

标签: c linux scanf

我在代码下运行并尝试使用 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

提前致谢。

3 个答案:

答案 0 :(得分:3)

C语言不检查数组的大小。你应该这样做。当你将str2复制到str时,你就是&#34;入侵&#34;不属于str的内存空间。第25个字符未定义后会发生什么。 (幸运的是它还没有修改,因为它是一个简短的程序,但不要指望它!)

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

尝试让str2更长一点。我把它扩展了20多位,得到了一个核心转储,这是预期的。

你之所以成功&#34;是因为编译器可能会将你的值存储在某个2 ^ n基础上以提高效率,所以你得到了一些你没有要求的额外字节。