2017-01-24 14 views
-2

ich nicht condtional Sprung mit valgrind verstehen, habe ich diese kleine Funktion, aber auch wenn es-s klein ist, gibt dies condtional SprungC - bedingter Sprung (valgrind)

hier ist die Funktion:

#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); 
} 

Wenn ich valgrind bin mit wie diese

valgrind ./a.out "aa aa aaaaaaaaaaa" 

es gibt mir ein Fehler

==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) 

Was bedeutet das? Danke.

+1

"und ich fand, dass es war, weil ich meine Variable nicht initialisiert habe" - also, was ist deine Frage eigentlich? Scheint, dass du den Grund schon gefunden hast. – taskinoor

+0

Ich verstehe diesen Fehler nicht Valgrind – Beben

+0

Bitte zeigen Sie eine [MCVE]. –

Antwort

2

Zuerst hilft es, Ihr Programm mit Debugging-Symbolen zu kompilieren (verwenden Sie die Option -g). Auf diese Weise kann Valgrind hilfreichere Diagnosen erstellen.

Der bedingte Sprung tritt nicht in Ihrem Code auf, sondern passiert, wenn printf() am Ende von main() aufgerufen wird. Der Grund dafür ist, dass Sie die Variable cpy zuweisen, aber dies initialisiert seinen Speicher nicht. Dann kopieren Sie das Zeichen 'b' in cpy für jeden 'a', den Sie in str sehen. Sie fügen jedoch am Ende cpy keinen NUL-Terminator hinzu. Wenn Sie versuchen, cpy zu drucken, liest etwas in der C-Bibliothek daher den initialisierten Teil von cpy und löst die Fehlermeldung von Valgrind aus.

Entweder ein NUL-Terminator selbst (cpy[a] = '\0'; vor dem return) hinzufügen, oder verwenden Sie calloc() statt malloc().

Verwandte Themen