Snprintf:为什么不在第二个参数超过目标内存时报告错误

时间:2016-09-24 11:39:47

标签: c++ c linux printf

这是我在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。

2 个答案:

答案 0 :(得分:1)

访问分配的块之外的内存是未定义的行为。

分段错误是一种特殊的错误,它是由访问“不属于你”的内存引起的。但反之则不然,即你不能说每当你访问未分配时你都会遇到分段错误存储器中。

有些系统在没有内存保护的情况下运行,因此您无法判断一块内存是否实际上“属于您”,因此不知道是否会发生分段错误,只保证未定义的行为。

答案 1 :(得分:1)

C本身没有任何边界检查。访问超出范围的内存是undefined behavior。它可能导致运行时错误(以分段错误的形式)或只是覆盖其他一些内存区域(破坏其他一些变量/内存位置)和运行良好。这根本不明确。

也就是说,拥有(使用)snprintf()的目的是正确提供长度以避免sprintf()之外的超出内存访问。你应该以适当的方式使用它,比如

snprintf(str,sizeof(str),"0123456789012345678");

因为,如C11中所述,章节§7.21.6.5

  

[...]否则,输出超出n-1 st的字符   丢弃而不是写入数组,并在末尾写入空字符   实际写入数组的字符。 [..]

使用snprintf()而不是sprintf()