0

为什么下面的代码成功了,尽管我只使用 malloc() 在堆上占用了 1 个字节:

char* sp=(char*)malloc(1);
strcpy(sp,"aaaaa");

sp有 1 字节的堆大小,它可以处理aaaa更多的 1 字节!怎么来的!

我正在使用 MS VS 2010。

4

3 回答 3

3

这被称为未定义的行为,目前似乎可以工作。但很可能会在以后发生奇怪且看似无关的事情。

于 2012-10-31T15:59:05.790 回答
3

这称为未定义行为。仅仅因为您机器上编译器似乎对此没有问题,并不意味着另一个编译器或另一个平台的行为将相同。(提示:由于此用例的简单性,您没有看到任何不良影响。任何更复杂的事情,您都会遇到重大问题。)

实际上,分配溢出了您的分配。在这种情况下会发生什么取决于您的编译器和您的特定 C/C++ 运行时。在某些平台上,这将导致段错误或访问冲突(尤其是在使用 Electric Fence 或 Valgrind 等调试辅助工具时)。

像这样的代码最好的情况是立即崩溃!如果代码没有崩溃,那么您很可能破坏了另一个内存分配,并且您的应用程序稍后会崩溃或损坏数据——所谓的“定时炸弹”错误。定时炸弹更难调试,因为应用程序崩溃的点可能在任何地方,而且很可能离坏代码不远。

于 2012-10-31T15:59:17.170 回答
1

堆分配是一项合作活动。通过覆盖分配空间的末尾,您玩得不好,并且会发生不好的事情。

保持在分配给您的空间内是您的工作。没有人会阻止你越过最后,甚至在属于你的程序的随机内存位上写,但结果将是......不可预测的。(这是“坏”的代码)。

于 2012-10-31T15:59:38.737 回答