函数join()中char和char *的问题

时间:2016-05-29 13:37:57

标签: c linux join char valgrind

我在C中使用以下签名实现了一个函数:

char *join(char **strv, char sep); 

该函数接收一个字符串数组,它返回一个字符串,其中包含数组中的所有子字符串,用字符" sep"分隔。

我的代码有效,但Valgrind抱怨道:

  

== 2526 ==命令:./ strutil

     

== 2526 ==

     

== 2526 ==条件跳转或移动取决于未初始化的值

     

== 2526 ==在0x4C2EC78:strcat(在/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so中)

     

== 2526 == by 0x400CDE:strcat(string3.h:148)

     

== 2526 == by 0x400CDE:join(strutil.c:90)

     

== 2526 == by 0x4006EE:main(strutil.c:117)

     

== 2526 ==未初始化的值是由堆栈分配

创建的      

== 2526 ==在0x400C30:join(strutil.c:72)

     

== 2526 ==

     

== 2526 ==条件跳转或移动取决于未初始化的值

     

== 2526 ==在0x4C2EC78:strcat(在/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so中)

     

== 2526 == by 0x400CDE:strcat(string3.h:148)

     

== 2526 == by 0x400CDE:join(strutil.c:90)

     

== 2526 == by 0x400722:main(strutil.c:121)

     

== 2526 ==未初始化的值是由堆栈分配

创建的      

== 2526 ==在0x400C30:join(strutil.c:72)

     

== 2526 ==

     

== 2526 ==

     

== 2526 == HEAP SUMMARY:

     

== 2526 ==在退出时使用:0块中的0字节

     

== 2526 ==总堆使用量:15个分配,15个释放,474个字节分配

     

== 2526 ==

     

== 2526 ==所有堆块都被释放 - 没有泄漏可能

     

== 2526 ==

     

== 2526 ==对于检测到的和抑制的错误计数,请重新运行:-v

     

== 2526 ==错误摘要:来自2个上下文的3个错误(被抑制:0从0开始)

这就是我调用函数的方法:

char *result = join(strv, ';');

我想通过使用双引号并将函数签名更改为char * join(char ** strv,char * sep)来解决问题;但我不应该改变功能签名。

这是给我带来麻烦的一线:

strcat(string, &sep); 

"串"是返回值。

有没有办法在不改变功能签名的情况下解决问题?

提前致谢。

1 个答案:

答案 0 :(得分:0)

不,这个问题在签名时是无法解决的,因为你无法在不知道其大小的情况下迭代C中的数组。

如果您更改了签名以包含某种维度,那么您可以在评论中采用David Rankin提供的方法。