编译器是否优化了由"malloc()"函数分配的内存?

Joh*_*n G 0 c memory optimization memory-management

我们假设处理器中有200个字节的内存.

这是代码:

#include <stdlib.h>

char * p;
char data;
void test1()
{
    p = (char *)malloc(sizeof(char) * 300);
    p[0] = 1;
}

void test2()
{
    p = (char *)malloc(sizeof(char) * 300);
    data = p[5];
}
Run Code Online (Sandbox Code Playgroud)

当我运行"test1()"时,显然会有内存溢出.但是"test2()"不会.编译器是否优化了"test2()"中的内存?怎么样?

还有一个奇怪的问题:

void test3()
{
    char ele[1000]={0};     
}

void test4()
{
   char ele[1000];
   ele[999] = 10;
}
Run Code Online (Sandbox Code Playgroud)

"test3()"将导致内存溢出,"test4()"将不会.

抱歉我的英语不好,谢谢你的回答.

================================================== ====

最后,我想出来了.我检查了汇编代码,在"test3"中它确实分配了内存.但是在"test4"中,编译器优化了数组,没有为它分配内存.

谢谢@Philipp,谢谢大家.

Phi*_*ipp 5

当malloc因为无法分配足够的内存而失败时,它不会崩溃.它将返回内存地址0.

当您忽略检查返回值并将该值视为数组时,您仍然可以从中读取它.原因是运算符[5]基本上与"从该地址开始,在内存中向前移动5步,并从那里读取"一样多.所以当p为0时,你会data = p[5];读到内存地址5.这不是你分配的内存 - 它就是那个位置的内存.

但是当你尝试写一些东西到p [0]时,你试图写入0不允许的内存地址,并将导致运行时错误.

底线:每当你做malloc时,检查返回值.当它为0时,内存分配失败,你必须处理它.