2017-01-24 4 views
-2

Я не понимаю condtional прыжка с Valgrind, я сделал эту маленькую функцию, но даже если он-s маленького, есть этот condtional прыжокC - условный переход (Valgrind)

вот функция:

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
char *function(char *str) 
{ 
    int i = 0; 
    int a = 0; 
    char *cpy; 

    cpy = malloc(100); 
    while (str[i] != '\0') 
    { 
     if (str[i] == 'a') 
     cpy[a++] = 'b'; 
     i++; 
    } 
    return (cpy); 
} 

int  main(int ac, char **av) 
{ 
    char *str; 

    str = function(av[1]); 
    printf("%s\n", str); 
} 

Когда я использую Valgrind как этот

valgrind ./a.out "aa aa aaaaaaaaaaa" 

это дает мне 1 ошибку

==3397== Conditional jump or move depends on uninitialised value(s) 
==3397== at 0x4C2E4E8: strlen (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so) 
==3397== by 0x4EA1531: puts (in /lib64/libc-2.24.so) 
==3397== by 0x400609: main (in /home/benoit.pingris/train/a.out) 

Что это значит? Спасибо.

+1

«И я обнаружил, что это произошло потому, что я не инициализировал свою переменную» - так каков ваш вопрос на самом деле? Кажется, вы уже нашли причину. – taskinoor

+0

Я не понимаю эту ошибку valgrind – Beben

+0

Пожалуйста, покажите [MCVE]. –

ответ

2

Во-первых, это помогает скомпилировать вашу программу с помощью отладочных символов (используйте опцию -g). Таким образом, Valgrind может производить более полезную диагностику.

Условный переход не происходит внутри вашего кода, а происходит, когда printf() вызывается в конце main(). Причина этого в том, что вы назначаете переменную cpy, но это не инициализирует ее память. Затем вы копируете символ 'b' в cpy за каждые 'a' вы видите в str. Однако вы не добавляете NUL-терминатор в конце cpy. Когда вы пытаетесь распечатать cpy, что-то внутри библиотеки C будет поэтому читать после инициализированной части cpy, вызывая сообщение об ошибке от Valgrind.

Либо добавьте NUL-терминатор самостоятельно (cpy[a] = '\0'; перед return), или использовать calloc() вместо malloc().

Смежные вопросы