为什么用malloc分配了一个int的空间可以输入3个int?

为什么我用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不对数组进行越界检查..

------------------------------------------------------------------------------

答主:Aggressssif

题主肯定没有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...
永不止步步 发表于01-03 10:18 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67417个|学分:363791个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号