在工作上开发的时候遇到了一个关于内存的问题。
程序总是会莫名其妙的崩溃掉,后来定位到了是内存处理方面的问题,原来是memset出的错。
代码中有这样的语句,
memset(src, 0 ,512);
但是这个src指针指向的内存并没有512个字节,导致程序崩溃。
后来查资料,做测试才找到问题原因。
上面的语句在编译运行的过程总是不会产生任何警告或是错误的,程序会按照语句的意思完完全全的执行下去,不过如果在执行之后,使用src指针对这个内存释放的话就会出错了。
以下面的程序为例:
int main(void)
{char *p = (char *)malloc(10);
char *test = "this";
memset(p, 0, 100);
memcpy(p, test, 10);
printf("p[99] = %d\n", p[99]);
printf("%s\n", p);
free(p);
return 0;
}
使用GCC编译上面的代码,执行发现在执行到free的时候会导致吐核退出。
如果没有free的话,该程序可以安全无恙的执行完成。
查看出错信息,好像会比对在堆上分配的内存的新旧顶端和低端。
程序在malloc的时候,会保存分配的内存的信息,在memset的时候,会对这些信息进行修改,尤其是长度,如果在free的时候检测到这些信息不一致,程序会吐核退出。
因此在使用memset的时候,尽量将长度定义为宏来使用,如果是数组的话,可以将长度设置为sizeof(array),总之尽量不要使用具体数值。