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];
}
当我运行"test1()"时,显然会有内存溢出.但是"test2()"不会.编译器是否优化了"test2()"中的内存?怎么样?
还有一个奇怪的问题:
void test3()
{
    char ele[1000]={0};     
}
void test4()
{
   char ele[1000];
   ele[999] = 10;
}
"test3()"将导致内存溢出,"test4()"将不会.
抱歉我的英语不好,谢谢你的回答.
最后,我想出来了.我检查了汇编代码,在"test3"中它确实分配了内存.但是在"test4"中,编译器优化了数组,没有为它分配内存.
谢谢@Philipp,谢谢大家.
当malloc因为无法分配足够的内存而失败时,它不会崩溃.它将返回内存地址0.
当您忽略检查返回值并将该值视为数组时,您仍然可以从中读取它.原因是运算符[5]基本上与"从该地址开始,在内存中向前移动5步,并从那里读取"一样多.所以当p为0时,你会data = p[5];读到内存地址5.这不是你分配的内存 - 它就是那个位置的内存.
但是当你尝试写一些东西到p [0]时,你试图写入0不允许的内存地址,并将导致运行时错误.
底线:每当你做malloc时,检查返回值.当它为0时,内存分配失败,你必须处理它.
| 归档时间: | 
 | 
| 查看次数: | 170 次 | 
| 最近记录: |