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