Snprintf:当第二个参数超过目标内存时,为什么不报告错误
Snprintf: why not report error when second argument over destination memory
这是我在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_。
相关文章:
- 为什么不;名字在地图上是按顺序排列的吗
- 为什么不能修改对象中的值?另外,我如何改进此链表?
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- C++ 基本 CTOR 说明 - 为什么不调用赋值/复制构造函数
- 为什么不递增?(构造函数)
- 为什么一个接一个声明的两个变量在内存中不相邻?
- QThreads - 为什么要在构造函数中分配内存而不是使用普通的类成员?
- 为什么cout输出内存地址不是字符串?
- 为什么动态分配的两个变量的内存位置不是连续的?
- 为什么不能在 Visual C++ 中动态分配堆栈内存?但海湾合作委员会可以做到
- 为什么此获取和释放内存围栏不能给出一致的值?
- 搜索为什么不分配内存
- 为什么 C++/Java 内存模型不包含条件变量
- 在声明节点创建链接列表时,为什么静态内存分配不起作用
- 为什么 2^80 字节的内存分配不会失败?
- 为什么内存集不分配 1?
- 与 boost::interprocess_mutex 相比,为什么不在共享内存中使用 boost::mutex
- 为什么达到峰值后内存泄漏不会继续
- 为什么数组的内存地址不总是增加呢?
- Snprintf:当第二个参数超过目标内存时,为什么不报告错误