我在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);
"串"是返回值。
有没有办法在不改变功能签名的情况下解决问题?
提前致谢。
答案 0 :(得分:0)
不,这个问题在签名时是无法解决的,因为你无法在不知道其大小的情况下迭代C中的数组。
如果您更改了签名以包含某种维度,那么您可以在评论中采用David Rankin提供的方法。