Как исправить ошибку 'valgrind' условного перехода или перемещения в зависимости от неинициализированных значений (значений) для strlen? - PullRequest
2 голосов
/ 24 апреля 2019

Моя цель состоит в том, чтобы сделать обратные две цифры, такие как 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 Ответ

1 голос
/ 24 апреля 2019

Проблема в том, что 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 также записывает только первые 6 элементов reverse_chr.

int len_reverse_chr = strlen(reverse_chr);

Затем эта строка пытается найти байт NUL в reverse_chr, но первые 6элементы не '\0', а 7-й неинициализирован (отсюда и жалоба от valgrind).

Исправлено:

Либо выполните

reverse_chr[chrlen] = '\0';

после цикла, либоиспользуйте calloc:

reverse_chr = static_cast<char *>(calloc(strlen(chr)+1, sizeof *reverse_chr));

Таким образом, все выделенные байты инициализируются (и вам больше не нужно memset).

...