如何解决Printf输出超出数组指定长度的字符
我尝试了这段代码:
char string_one[8],string_two[8];
printf("&string_one == %p\n",&string_one);
printf("&string_two == %p\n",&string_two);
strcpy(string_one,"Hello!");
strcpy(string_two,"Long string");
printf("string_one == %s\n",string_one);
printf("string_two == %s\n",string_two);
并获得以下输出:
&string_one == 0x7fff3f871524
&string_two == 0x7fff3f87151c
string_one == ing
string_two == Long string
由于第二个字符串长度值大于相应数组的指定大小,因此下标值大于指定数组大小的字符将存储在下一个字节中,这些字节属于第一个数组,如地址所示。显然第一个字符串被覆盖。
第二个数组无法容纳整个字符串,它太大了。但是,输出将打印整个字符串。
我推测了一会儿,得出的结论是,printf()
函数会一直输出下一个字节中的字符,直到遇到字符串终止符'\0'
为止。我的思考没有得到任何证实,所以问题是这些猜测正确吗?
解决方法
根据C标准(5.2.1个字符集)
2在字符常量或字符串文字中,执行的成员 字符集应由 源字符集或由 反斜杠\后跟一个或多个字符。 所有位的字节 设置为0的字符(称为空字符)应存在于基本 执行字符集;它用于终止字符串。
然后(7.21.6.1 fprintf函数)
,8转换说明符及其含义为:
s 如果没有l长度修饰符,则参数应为指针 到字符类型数组的初始元素。273)字符 从数组中写入直到(但不包括)终止符 空字符。
我的编译器(GCC)说:
,警告:“ __ builtin_memcpy”在大小为8的区域中写入12个字节会溢出目标[-Wstringop-overflow =] strcpy(string_two,“长字符串”);
并且只是为了展示优化将如何处理您认为您知道的所有内容并将其颠倒过来,这就是如果您在64位PowerPC Power-9上进行编译(又称为非x86)和gcc -O3 -flto
$ ./char-array-overlap
&string_one == 0x7fffc502bef0
&string_two == 0x7fffc502bef8
string_one == Hello!
string_two == Long string
因为查看机器代码,它根本不会执行strcpy
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。