一段总提示 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);
}
...全文
72 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhiys 2011-09-05
  • 打赏
  • 举报
回复
非常感谢,呵呵, 确实是内存越界,感谢,这对我是个深刻的教训,费了我2天时间没查到原因.多谢,多谢.
無_1024 2011-09-05
  • 打赏
  • 举报
回复
内存越界了 free和malloc成对出现的时候 如果free提示错误 就是内存越界 建议多检查检查
jackyjkchen 2011-09-05
  • 打赏
  • 举报
回复
不用看就知道内存越界

所以
pointer_string_string=(char **)realloc(pointer_string_string , sizeof(char *)*(number+2));
我加了一个单元,OK了

具体为什么就不分析了

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧