C++ 此代码似乎在分配的范围之外附加字符

C++ 此代码似乎在分配的范围之外附加字符,c++,c,string,malloc,C++,C,String,Malloc,我在玩cpp的一些基本东西。我是这门语言的新手。。。所以我警告说,我的问题可能没有正确表述。谢谢你的帮助 问题是,在看到中的示例后,我发现自己使用了以下代码: #include <stdio.h> int main (void) { char *str; str = (char*) malloc(2); str[0] ='8'; str[1] ='8'; str[2] ='6'; str[3] ='\0'; printf ("%s\n",str); }

我在玩cpp的一些基本东西。我是这门语言的新手。。。所以我警告说,我的问题可能没有正确表述。谢谢你的帮助

问题是,在看到中的示例后,我发现自己使用了以下代码:

#include <stdio.h>

int main (void) {
  char *str;
  str = (char*) malloc(2);
  str[0] ='8';
  str[1] ='8';
  str[2] ='6';
  str[3] ='\0';
  printf ("%s\n",str);
}
(通用条款第4.7.2版)

我没有得到任何错误和输出886。为什么我没有错误?我没有通过分配空间的边界吗

我没有得到任何错误,我得到了886的输出。为什么没有错误?我没有通过分配空间的边界吗

在代码正常的情况下。。。为什么参考文献中的例子? 在另一种(更可能的)情况下。。。风险是什么


谢谢

> P>你不会有任何错误,因为C和C++没有做边界检查。你重写了你没有使用的部分记忆,但你很幸运,它并不重要。把它比作把一排钉子钉在墙上,你知道那里有一个钉子。如果您错过了螺柱,大多数情况下,您只是在石膏上打了一个洞,但继续这样做是危险的,因为最终,您会碰到一根带电的导线。

您已经超过了分配内存的边界

然而,printf并不关心您声明的内存大小。它所关心的是它将从头开始并继续,直到找到一个0

您创建的案例是未定义的行为。在您分配的区域(可能是另一个变量)之后可能会有一些其他数据,在这种情况下,它将被损坏。如果下一部分是未分配的内存,您可能会在没有可见问题的情况下逃逸。如果分配的内存之后的内存属于另一个进程,那么您将看到漂亮整洁的分段错误。后果可能更糟,所以最好不要在任何地方尝试

以下内容可在glibc的malloc.c中找到:

每个分配块的最小开销:每个malloced 4或8字节 chunk有一个隐藏字,上面有大小和状态 信息

最小分配大小:4字节ptrs:16字节(包括4字节) 开销) 8字节PTR:24/32字节(包括4/8开销)

释放块时,12(用于4字节PTR)或20(用于8字节
PTR(但4字节大小)或24(对于8/8)额外字节是必需的; 4(8)个字节用于尾部大小字段,8(16)个字节用于自由列表 指针。因此,最小可分配大小为16/24/32字节


由于最小分配大小为16/24/32,因为它大于3字节,所以程序运行时没有错误。这是一个可能正确执行程序的工具。

任何体面的静态分析工具(例如CPPCHECK)应该告诉你(我认为即使Eclipse CDT C++分析器也可以)。谢谢。离C++有多远?主要区别是什么?一个新手如何区分这两者?(对于fortran,我花了几年时间才知道每个版本的sintax是什么)最简单的线索是使用
malloc
printf
。大多数C++代码使用<代码>新< /代码>和<代码> cOUT <代码>。这是所有可能实现的一个(!)——一个具有微小内存的嵌入式系统的MALLC可以精确分配请求的内存(没有更多)。我相信他遇到了这种malloc的实现。谢谢。这也有帮助。事实上,我要求任何帮助,我总是学习。非常感谢!答案很快!伟大的论坛,伟大的用户。
gcc -O0 -pedantic -Wall test2.cpp