如何修复'条件跳转或移动取决于strlen的未初始化值'valgrind错误?

问题描述 投票:1回答:1

我的目标是使反向两位数如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错误。

c++ valgrind
1个回答
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)。

© www.soinside.com 2019 - 2024. All rights reserved.