为什么下面的代码成功了,尽管我刚刚使用malloc()在堆上占据了1个字节:
char* sp=(char*)malloc(1);
strcpy(sp,"aaaaa");
sp
具有1个字节堆大小,并且可以处理aaaa
,这是1个字节!它是如何来的!
我正在使用MS VS2010。
这称为未定义的行为。仅仅因为您的上的编译器您的机器似乎没有问题,这并不意味着另一个编译器或另一个平台的行为会相同。(提示:由于这种用例的简单性,您没有看到任何不适的影响。任何更复杂的事情,您会遇到重大问题。)
有效地,分配会溢出您的分配。在这种情况下发生的事情取决于您的编译器和特定的C/C 运行时。在某些平台上,这将导致违规或访问违规行为(尤其是在使用电动围栏或Valgrind等调试辅助工具时)。
最佳案例场景与这样的代码是立即崩溃的!如果代码没有崩溃,则您可能会破坏其他内存分配,并且您的应用程序以后将崩溃或损坏数据 - 所谓的"定时炸弹"错误。时间炸弹很难进行调试,因为应用程序崩溃的目的可能在任何地方,而且很可能远不及不良代码。
这被称为不确定的行为,现在可以使用 。但是很可能以后会发生奇怪而又看似无关的事情。
堆分配是一种合作练习。通过覆盖分配的空间的尽头,您的表现不佳,坏事将会发生。
保持您已分配的空间。没有人会阻止您终结,甚至在属于您程序的记忆中写作,但结果将是无法预测的。(这是"坏"的代码)。