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

Snprintf: why not report error when second argument over destination memory

本文关键字:内存 为什么不 错误 报告 目标 第二个 参数 Snprintf      更新时间:2023-10-16

这是我在CentOS6.6中的代码,但我不知道为什么可以正常运行。

#include <stdio.h>
#include <stdlib.h>
int main()
{
  char str[10]={0};
  snprintf(str,18,"0123456789012345678");
  printf("str=%sn",str);
   return 0;
 }

$/测试

str=01234567890123456

当18超过sizeof(str)时,为什么不报告错误?

我认为这将是分段故障,但没有任何报告。我使用CentOS6.6。

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

分段故障是由访问"不属于您"的内存引起的一种特定错误。但事实并非如此,即您不能说无论何时访问未分配的内存都会出现分段故障。

有些系统在没有内存保护的情况下运行,因此你无法判断一块内存是否真的"属于你",因此也不知道是否会发生分段故障,只有未定义的行为才能得到保证。

C本身没有任何边界检查。超出绑定内存的访问是未定义的行为。它可能会导致运行时错误(以分段故障的形式(,或者只是覆盖其他一些内存区域(损坏其他一些变量/内存位置(,运行良好。它只是未定义。

也就是说,具有(使用(snprintf()的目的是适当地提供长度,以避免通过sprintf()的越界存储器访问。你应该以正确的方式使用它,比如

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

因为,如C11第7.21.6.5节中所述

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

这使得在CCD_ 7之上使用CCD_。