我在代码下运行并尝试使用 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
提前致谢。
答案 0 :(得分:3)
C语言不检查数组的大小。你应该这样做。当你将str2复制到str时,你就是&#34;入侵&#34;不属于str的内存空间。第25个字符未定义后会发生什么。 (幸运的是它还没有修改,因为它是一个简短的程序,但不要指望它!)
答案 1 :(得分:2)
str
只能容纳25个字符。您试图将超过25个字符复制到其中。这会导致未定义的行为。
在C中,您有责任确保只写入已分配的内存。如果您不遵守规则,则无法保证。
您可以使用格式字符串"%24s"
和sscanf
来修复此代码。
答案 2 :(得分:1)
尝试让str2更长一点。我把它扩展了20多位,得到了一个核心转储,这是预期的。
你之所以成功&#34;是因为编译器可能会将你的值存储在某个2 ^ n基础上以提高效率,所以你得到了一些你没有要求的额外字节。