这是我在CentOS6.6中的代码,但我不知道为什么可以正常运行。
#include <stdio.h>
#include <stdlib.h>
int main()
{
char str[10]={0};
snprintf(str,18,"0123456789012345678");
printf("str=%s\n",str);
return 0;
}
$ ./test
STR = 01234567890123456
为什么不在sizeof(str)
之后报告错误?
我认为这将是Segmentation故障,但没有报道。我使用CentOS6.6。
答案 0 :(得分:1)
访问分配的块之外的内存是未定义的行为。
分段错误是一种特殊的错误,它是由访问“不属于你”的内存引起的。但反之则不然,即你不能说每当你访问未分配时你都会遇到分段错误存储器中。
有些系统在没有内存保护的情况下运行,因此您无法判断一块内存是否实际上“属于您”,因此不知道是否会发生分段错误,只保证未定义的行为。
答案 1 :(得分:1)
C本身没有任何边界检查。访问超出范围的内存是undefined behavior。它可能导致运行时错误(以分段错误的形式)或只是覆盖其他一些内存区域(破坏其他一些变量/内存位置)和运行良好。这根本不明确。
也就是说,拥有(使用)snprintf()
的目的是正确提供长度以避免sprintf()
之外的超出内存访问。你应该以适当的方式使用它,比如
snprintf(str,sizeof(str),"0123456789012345678");
因为,如C11
中所述,章节§7.21.6.5
[...]否则,输出超出
n-1
st的字符 丢弃而不是写入数组,并在末尾写入空字符 实际写入数组的字符。 [..]
使用snprintf()
而不是sprintf()
。