下面是昨天遇到问题的一个简化版本:
#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不足绝对是个坏习惯 !而那些字符串函数同样是不安全的!