一段总提示 free 操作错误的函数
zhiys 2011-09-05 06:04:47 下面是一段我写的测试程序,主要是为了实现把一个输入字符串,根据指定的分割字符,分割到一个2维字符串数组中去。
比如:<programme_name> <"xxx/yyy/zzz">
则根据`/`字符进行分割后,分成3个字符串 "xxx" , "yyy" , "zzz" 并存放到一个2维字符串数组中。
然后打印出结果,再释放这个2维字符数组的空间。
但是这个程序成功分配了2维空间后,执行free_string_string 就会出错,说我free 了一个不正确的地址
下面是错误内容:
*** glibc detected *** ./FZHI_string_disassemble_test: free(): invalid pointer: 0x089e3018 ***
而我无论如何却也检查不出,我哪里错了,即使我用gdb 跟踪,看到地址都没问题啊,
还请各位大牛帮助我,我先行谢过了。
下面是程序源码:
char **FZHI_string_test(char * , char);
void print_string_string(char **);
void free_string_string(char **);
int main(int argument_number , char *argument_string[])
{
char **pointer_string=NULL ;
pointer_string=FZHI_string_test(argument_string[1] , '/');
print_string_string(pointer_string);
free_string_string(pointer_string);
return(1);
}
// 打印2维字符串指针中的,每一个字符串。
void print_string_string(char **pointer_string_string)
{
for(int i=0 ; ; i++)
{
if(pointer_string_string[i]==NULL){ break ; }
fprintf(stdout , "[%d]=%s\n" , i , pointer_string_string[i]);
}
}
//释放2维字符串指针。
void free_string_string(char **pointer_string_string)
{
for(int i=0 ; ; i++)
{
if(pointer_string_string[i]==NULL){ break ; } //遇到NUL 表示2维的字符串指针free到末尾了,跳出循环
free(*(pointer_string_string+i));
}
free(pointer_string_string);
}
// 拆解字符串,根据character 字符为标记,把字符串分解存放到,一个2维字符数组中。
// 此函数不考虑分割字符连续出现,分割字符出现在字符串头或尾的情况。
char **FZHI_string_test(char *pointer_string , char character)
{
char **pointer_string_string=NULL ;
int number=0 , length=strlen(pointer_string);
for(int i=0 ; i<length ; i++){ if(pointer_string[i]==character){ number++ ; } }
// 获取分割字符character 的个数。
pointer_string_string=(char **)realloc(pointer_string_string , sizeof(char *)*(number+1));
// 根据分割字符的个数,创建一个2维指针,准备存放各个被分割的子字符串。
int count=0 ;
for(int i=0 ;; i++)
{
pointer_string_string[i]=NULL ; // 最后一个字符串使用 NULL,表示2维字符指针结束标记。
if(pointer_string[count]=='\0'){ break ; } //字符串检测到末尾跳出循环
for(int j=0 ; ; j++)
{
pointer_string_string[i]=(char *)realloc(pointer_string_string[i] , sizeof(char)*(j+1));
if(pointer_string[count]==character) { pointer_string_string[i][j]='\0'; count++ ; break ;}
// 如果遇到分割字符,跳出循环,同时跳过分割字符。
if(pointer_string[count]=='\0'){ pointer_string_string[i][j]='\0' ; break ;}
// 如果遇到输入字符串结束字符,表示整个分割结束,跳出。
pointer_string_string[i][j]=pointer_string[count];
count++ ; // 下一个字符
}
}
return(pointer_string_string);
}