使用malloc、calloc函数分配内存空间和存储内容不匹配时引发的错误!

来源:互联网 发布:剑三万花成男捏脸数据 编辑:程序博客网 时间:2024/06/08 14:15

下面是昨天遇到问题的一个简化版本:

#include<stdio.h>#include<string.h>#include<stdlib.h>#include<ctype.h>char* copy(char a[]){char *newc=(char *)malloc(sizeof(char));strcpy(newc,a);return newc;}void err(char a[],char b[]){a=copy(a);b=copy(b);int *add=(int *)calloc(4,sizeof(int));//这里会触发断点}int main(){char a[]="222222222222222222222222222222222222222222222222222";char b[]="111111111111111111111111111111111111111111111111111";/*char a[]="-1298749999";char b[]="9999999999999";*/err(a,b);return 0;}
原因:先malloc的指针p被分配一个地址,然后如果继续malloc一个q那么就会接着这片内存分配。
不过即使p和q都是1位,都会在p,q之间预留一块空间。导致写入内存的字符串较短的时候不会出现错误。而当溢出的部分足够长时,问题就来了。
假如先malloc的指针p没有预留好足够的空间却被赋一个超出空间的值(例如malloc(4),然后写入很大的字符串,实际上内容保存在内存)。
那么在malloc后面的指针add时,编译器的记录中某片内存是可用的,就分配给了add,但实际上这段空间却被p占用了!


由此可见malloc时size不足绝对是个坏习惯 !而那些字符串函数同样是不安全的!

0 0
原创粉丝点击