如何解决“有条件的跳跃或移动取决于未初始化的值” valgrind错误而导致的错误?

时间:2019-04-24 04:47:03

标签: c++ valgrind

我的目标是将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错误。

1 个答案:

答案 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)。