我的目标是将123456到563412这样的两位数取反。
我正在使用valgrind工具检查内存泄漏问题,但是strlen(reverse_chr)
函数会导致此错误:
有条件的跳跃或移动取决于未初始化的值
这是我的代码:
#include <stdio.h>
#include <string.h>
#include <string>
int main()
{
char chr[] = "123456";
char* reverse_chr=(char *) malloc(strlen(chr)+1);
memset(reverse_chr, 0, strlen(chr));
int chrlen=strlen(chr);
for (int t=0; t<chrlen; t+=2)
{
reverse_chr[t]=chr[chrlen-t-2];
reverse_chr[t+1]=chr[chrlen-t-1];
}
int len_reverse_chr = strlen(reverse_chr);
free(reverse_chr);
return 0;
}
我希望输出没有任何valgrind错误。
答案 0 :(得分:0)
问题在于reverse_chr
无效,因为未正确终止。
char* reverse_chr=(char *) malloc(strlen(chr)+1);
memset(reverse_chr, 0, strlen(chr));
您分配了7个字节,但仅将前6个字节设置为0
。
for (int t=0; t<chrlen; t+=2)
{
reverse_chr[t]=...
reverse_chr[t+1]=...
此for
循环也仅写入reverse_chr
的前6个元素。
int len_reverse_chr = strlen(reverse_chr);
然后,此行尝试在reverse_chr
中找到一个NUL字节,但是前6个元素不是'\0'
,第7个元素未初始化(因此,valgrind投诉)。
修复:
要么做
reverse_chr[chrlen] = '\0';
循环后,或使用calloc
:
reverse_chr = static_cast<char *>(calloc(strlen(chr)+1, sizeof *reverse_chr));
通过这种方式,所有分配的字节都将初始化(并且您不再需要memset
)。