2017-01-24 27 views
-2

は、私はこの小さな機能を作ったが、それの小さなは、このcondtionalジャンプここC - 条件ジャンプ(valgrindの)私はvalgrindのとcondtionalジャンプを理解していない

がある場合でも機能です:

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

私はそれは私に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) 
を与えるこの

valgrind ./a.out "aa aa aaaaaaaaaaa" 

ようvalgrindのを使用しています

どういう意味ですか?おかげさまで

+1

"私は自分の変数を初期化しなかったために見つかった" - 実際にあなたの質問は何ですか?あなたはすでにその理由を見つけたようだ。 – taskinoor

+0

私はこのエラーを理解していませんvalgrind – Beben

+0

[MCVE]を示してください。 –

答えて

2

最初に、プログラムをデバッグシンボルでコンパイルするのに役立ちます(-gオプションを使用してください)。このように、Valgrindはより有用な診断を生成することができます。

条件付きジャンプはコード内では発生しませんが、の末尾でprintf()が呼び出されたときに発生します。その理由は、変数cpyを割り当てることですが、これはそのメモリを初期化しないためです。次に'b'の文字を'a'の場合はstrにあるcpyにコピーしています。ただし、cpyの末尾にNULターミネータを追加していません。 cpyを印刷しようとすると、Cライブラリ内の何かがcpyの初期化部分を超えて読み込まれ、Valgrindからのエラーメッセージが表示されます。

どちらかNULターミネーターを自分(returncpy[a] = '\0';)を追加、またはmalloc()の代わりにcalloc()を使用しています。

関連する問題