在最近的项目中,发现了一个比较奇怪的bug,bug的最终结果引发了free(): invalid next size (fast)错误,导致程序崩溃。 通常这个问题很常见,就是由于实际写入的内存大小超过了由malloc获取的内存块的大小导致的覆盖,解决方案也很简单,不管是stackoverflow还是其他论坛上对这个问题的解决方案通常都是在实际的大小上+1即可。
在博主正在做的项目中,原先的代码写法是通过strlen获取字符串长度,然后调用malloc来获得这个长度对应的内存块,于是就产生了上述的问题。当然这个问题目前已经解决了,只要strlen + 1 即可,但是奇怪的地方在于在项目中只有特定的字符串会引发这个问题,而并非所有通过这种方式分配的地址都会报错,这是为什么呢?
先说明场景:项目中采用UTF-8编码,并且字符串含有汉字与各类其他字符的组合。首先,utf-8属于变长编码,汉字通常占3字节,但是英文或其他的字符占一字节。因此,在博主的机器上,如下的代码会引发上述的错误:
typedef struct{
char* name;
char* address;
char* auth;
char* birthday;
}TEST;
int main()
{
TEST* ptest = (TEST*)calloc(1 , sizeof(TEST));
char* address = "一二三四五六七八九十一二三a";
char* name = "测试名";
char* auth = "一二三四五六七八九十一二三";
char* birthday = "12345678";
FILE* fp = NULL;
fp = fopen("/home/kylin/testcode/addr.log" , "w");
fprintf(fp , "sizeof TEST : %zd\nsizeof ch