这段代码似乎附加了超出分配范围的字符
This code seems to append characters outside allocated range
我正在玩一些基本的东西。我是这门语言的新手……所以我警告你,我的问题可能没有被正确地表述出来。谢谢你的帮助。
事情是,在看到www.cplusplus.com/reference/cstdlib/malloc/中的例子后,我发现我自己有这个代码:
#include <stdio.h>
int main (void) {
char *str;
str = (char*) malloc(2);
str[0] ='8';
str[1] ='8';
str[2] ='6';
str[3] =' ';
printf ("%sn",str);
}
和编译:
gcc -O0 -pedantic -Wall test2.cpp
(gcc version 4.7.2)
没有错误,输出886。为什么没有错误?我是否没有越过分配空间的边界?
我没有得到任何错误,我得到了输出886。为什么没有错误?我是否没有越过分配空间的边界?
在这种情况下,代码是好的…为什么参考文献中的例子?在另一种(更可能的)情况下……风险是什么?
谢谢!
你不会得到任何错误,因为C和c++不做边界检查。你覆盖了你没有使用的内存部分,但你很幸运,它不是什么重要的东西。把它比作在墙上钉一排钉子,你知道墙上有钉。如果你错过了钉钉,大多数情况下,你就在石膏上钻个洞,但这样做很危险,因为最终,你会撞到一根带电的电线。
您已超过已分配内存的边界。
然而,printf并不关心你声明的内存大小。它所关心的是它将从头开始并继续直到找到一个0。
您创建的案例是一个未定义的行为。在您分配的区域(可能是另一个变量)之后可能会有一些其他数据,在这种情况下,它将被损坏。如果下一部分是未分配的内存,则可以在没有明显问题的情况下进行转义。如果在您分配的内存之后的内存属于另一个进程,您将看到漂亮而整洁的分段错误。结果可能更糟,所以最好不要在任何地方尝试。
可以在glibc的malloc.c的注释中找到以下内容:
每个分配块的最小开销:每个malloced的4或8字节Chunk有一个隐藏的词来表示开销大小和状态信息。
最小分配大小:4字节ptrs: 16字节(包括4开销)8字节ptrs: 24/32字节(包括4/8开销)
当块被释放时,12(对于4字节的ptrs)或20(对于8字节的
)PTRS(但4字节大小)或24(对于8/8)额外的字节需要;4(8)字节表示尾随大小字段,8(16)字节表示空闲列表指针。因此,最小可分配大小为16/24/32字节。
因为最小分配的大小将是16/24/32,因为它大于3字节,你的程序运行没有错误。
- 将超出范围的整数分配给有符号字符类型
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 将引用分配给局部变量,如果局部变量超出范围,它会超出范围吗?
- C++ - 使用基于范围的 for 循环将字符值分配给向量中的字符串不会分配值
- 堆栈变量超出范围时是否解除分配?
- 如何简洁地将一个数组的范围分配给另一个数组
- 代码超出范围.如何动态分配此向量?
- 在另一个分配的矩阵中为特定范围创建 cv::Mat 标头
- 无法在命名空间范围内分配变量
- 矢量超出范围,将值分配给空矢量>不可能?
- 为什么在C 中不确定,为签名类型的对象分配范围的值的结果
- 将向量分配给向量向量的向量时,向量是范围的
- 在执行中脱离堆栈对象的范围之前,请分配堆栈对象
- 在类方法中使用新运算符动态分配内存的寿命和范围是多少
- 更改自动分配内存的范围是否会影响性能
- C++本地对象超出范围,返回指针(使用new分配的内存).因此内存泄漏
- 何时分配块范围变量
- 为什么存储在 STL 向量中的堆栈分配元素C++即使超出范围也仍然处于活动状态
- 将元素添加到基于范围的预分配向量中是否合法
- 这段代码似乎附加了超出分配范围的字符