为什么我用malloc分配了一个int的空间可以输入3个int?但是如果分配10个int,把3改成11,编译就会出错。为什么呢,我用devc++编译的
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n;
int sum=0;
int*s=(int*)malloc(sizeof(int)*1);
int i=0;
for(i=0; i<3; i++)
{
scanf("%d",&s[i]);
sum+=s[i];
}
printf("%d", sum);
free(s);
}
好吧,我刚才看到了好像是c不对数组进行越界检查..
------------------------------------------------------------------------------
题主肯定没有free自己申请的内存的习惯吧?
先不论越界溢出的问题,题主这个习惯不是很好,在写小程序可能没问题,但是在实际项目开发的时候,这样会产生内存泄露,埋下极大的隐患。
试想一下,如果你在一个子函数里 int*p=(int*)malloc(sizeof(int)*1); 在子函数执行完毕,局部变量指针p被回收,但是你malloc所申请的内存却并没有被回收,每每执行一次子函数,就要发生一次内存泄露,上线跑的程序长年累月的跑着,一直下去,这个函数被执行了几万次,几十万次,几百万次,那么会发生什么后果呢?
回到这个问题本身,当你规范了你的用法后,你会发现,你这样写,在free的时候编译器就异常报错了。原因正是因为你实际使用时指针长度超过了你申请的范围。
所以在用malloc的时候,要做到随时申请随时检查,随时用完随时释放,并且释放完后要给头指针置NULL,否则它会成为一个野指针。
简单的规范格式如下:
// Code...
char *Ptr = NULL;
Ptr = (char *)malloc(100 * sizeof(char));
if (NULL == Ptr)
{
exit (1);
}
gets(Ptr);
// code...
free(Ptr);
Ptr = NULL;
// code...