我们假设处理器中有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,谢谢大家。
答案 0 :(得分:5)
当malloc因为无法分配足够的内存而失败时,它不会崩溃。它将返回内存地址0
。
当您忽略检查返回值并将该值视为数组时,您仍然可以从中读取。原因是运算符[5]
基本上与“从该地址开始,在内存中向前移动5步,并从那里读取”一样多。因此,当p为0,并且您执行data = p[5];
时,您将读取内存地址5
处的内容。这不是你分配的内存 - 它就是那个位置的内存。
但是当你尝试写一些东西到p [0]时,你试图写入不允许的内存地址0
,这将导致运行时错误。
底线:每当您执行malloc时,请检查返回值。当它为0时,内存分配失败,你必须处理它。
答案 1 :(得分:3)
当您请求的内存分配大于可用内存时,malloc()
只返回NULL
。要检查这一点,只需在代码中添加错误检查,例如
#include <stdlib.h>
char * p;
char data;
void test1()
{
p = (char *)malloc(sizeof(char) * 300);
if(p == NULL)
{
printf("Failed to allocate memory\n");
return -1;
}
p[0] = 1;
}
void test2()
{
p = (char *)malloc(sizeof(char) * 300);
if(p == NULL)
{
printf("Failed to allocate memory\n");
return -1;
}
p[0] = 1;
data = p[5];
}
上述调用只会在您的情况下返回错误。