【问题标题】:Storing bytes more than what a heap has存储的字节数超过堆的容量
【发布时间】:2012-10-21 03:31:42
【问题描述】:
为什么下面的代码成功了,虽然我只是使用 malloc() 在堆上占用了 1 个字节:
char* sp=(char*)malloc(1);
strcpy(sp,"aaaaa");
sp 有 1 个字节的堆大小,它可以处理超过 1 个字节的aaaa!怎么来的!
我正在使用 MS VS 2010。
【问题讨论】:
标签:
c
string
malloc
heap-memory
【解决方案1】:
这称为未定义行为。仅仅因为 your 机器上的 your 编译器似乎对此没有问题,并不意味着另一个编译器或另一个平台的行为会相同。 (提示:由于此用例的简单性,您不会看到任何不良影响。如果再复杂一些,您最终会遇到重大问题。)
实际上,分配溢出了您的分配。在这种情况下会发生什么取决于您的编译器和您的特定 C/C++ 运行时。在某些平台上,这会导致段错误或访问冲突(尤其是在使用 Electric Fence 或 Valgrind 等调试辅助工具时)。
使用这样的代码的最佳情况场景会立即崩溃!如果代码没有崩溃,那么您很可能破坏了另一个内存分配,并且您的应用程序稍后会崩溃或损坏数据——所谓的“定时炸弹”错误。定时炸弹要调试得多,因为应用程序崩溃的点可能在任何地方,而且很可能离坏代码不远。
【解决方案2】:
堆分配是一项合作活动。通过覆盖分配空间的末尾,您玩得不好,并且会发生坏事。
保持在分配的空间内是您的工作。没有人会阻止你越过最后,甚至在属于你的程序的随机内存位上写,但结果将是......不可预测的。 (这是“坏”的代码)。
【解决方案3】:
这称为未定义的行为,目前可能似乎起作用。但很可能会在以后发生一些奇怪且看似无关的事情。