C++内存分配问题

5

我的代码如下:

#include <string.h>
int main()
{
    int ii = 123;
    char str[7] = "";
    strcpy(str,"123456");
    return 0;
}

我在VS2010中运行,内存情况如下图所示

enter image description here

我想知道内存中的cc是用来做什么的?以及cc的数量是如何计算的?

2个回答

7
在Visual Studio中编译“调试”时,通常会使用cc来填充未初始化的内存。这样当您访问未初始化的内存时,更容易发现。
例如,如果您尝试取消引用未初始化的指针,则可能会收到类似以下内容的消息:
Access Violation accessing 0xcccccccc

或者类似于此类的东西。

在此输入图片描述


7
微软为什么选择0xCC作为空值填充字节呢?因为在x86指令集中,0xCC是一个单字节的断点指令。这样一来,如果你不小心执行了未填充的内存,程序会立即触发断点。 - Robᵩ
@Rob 我不知道这一点。:) 我想现在我们有了内存保护,这就不那么重要了吧? - Mysticial
2
@Mysticial:不完全是这样:这只适用于页面级别(整个页面可以标记为可执行或不可执行,仅当CPU、操作系统和进程都同意启用NX位时)。但如果您在2KB页面中使用了40字节的代码怎么办?该页面必须被标记为可执行,这将使页面的其余部分变为可执行,但包含垃圾 :) - jalf

1

当您访问未初始化的内存空间时,VC2010将始终警告您已访问包含0xcccccccc的某个地址。

0xcc是编译器(在调试版本中)用于填充未初始化内存的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接