2016-04-29 9 views
0

私はvalgrindからいくつかの不思議な初期化されていない値のメッセージを受け取りましたが、悪い値がどこから生じたのかは非常に謎でした。どこに問題があるか誰にも知らない?Valgrind-初期化されていない値のメッセージ

==26075== Memcheck, a memory error detector 
==26075== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al. 
==26075== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info 
==26075== Command: ./main 
==26075== 
==26075== Conditional jump or move depends on uninitialised value(s) 
==26075== at 0x4C2A020: strcmp (mc_replace_strmem.c:711) 
==26075== by 0x400CF6: stringcmp (main.c:121) 
==26075== by 0x4E64C69: msort_with_tmp (msort.c:84) 
==26075== by 0x4E6503B: qsort_r (msort.c:298) 
==26075== by 0x400930: main (main.c:42) 
==26075== 
==26075== Conditional jump or move depends on uninitialised value(s) 
==26075== at 0x4C2A024: strcmp (mc_replace_strmem.c:711) 
==26075== by 0x400CF6: stringcmp (main.c:121) 
==26075== by 0x4E64C69: msort_with_tmp (msort.c:84) 
==26075== by 0x4E6503B: qsort_r (msort.c:298) 
==26075== by 0x400930: main (main.c:42) 
==26075== 
==26075== 
==26075== HEAP SUMMARY: 
==26075==  in use at exit: 0 bytes in 0 blocks 
==26075== total heap usage: 4 allocs, 4 frees, 31 bytes allocated 
==26075== 
==26075== All heap blocks were freed -- no leaks are possible 
==26075== 
==26075== For counts of detected and suppressed errors, rerun with: -v 
==26075== Use --track-origins=yes to see where uninitialised values come from 
==26075== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 4 from 4) 

を私のコードがあります:

#include <stdio.h> 
#include <string.h> 
#include <malloc.h> 
#include <stdlib.h> 

char *input; 
int row = 0; 


int stringcmp(const void *a, const void *b); 

void permute(int n, int fix, char **arr); 

int factorial(int n); 

void swapSort(char array[], int left, int right); 

void quick_sort(char *array, int left, int right); 

void free2DArray(char **array, int row); 

int main() { 
    input = (char *) malloc(8 + 1 * sizeof(char)); 
    fgets(input, 9, stdin); 
    int n = strlen(input); 
    if (input[n - 1] == '\n') { 
     n--; 
     input[n] = '\0'; 
    } 
    int f = factorial(n); 
    printf("Length of string: %d\n", n); 
    printf("Input string: \"%s\"\n", input); 
    quick_sort(input, 0, n); 
    printf("Sorted: \"%s\"\n", input); 
    printf("Number of permutations: %d\n", f); 
    char **arrOfPermutations = (char **) malloc(factorial(n) * sizeof(char *)); 
    for (int i = 0; i < factorial(n); i++) { 
     arrOfPermutations[i] = (char *) malloc((n + 1) * sizeof(char)); 
    } 

    permute(n, n, arrOfPermutations); 
    qsort(arrOfPermutations, f, sizeof(char *), stringcmp); 
    for (int i = 0; i < f; i++) { 
     printf("\""); 
     for (int j = 0; j < n; j++) { 
      printf("%c", arrOfPermutations[i][j]); 
     } 
     printf("\"\n"); 
    } 
    free2DArray(arrOfPermutations, f); 
    free(input); 

    return 0; 
} 


void free2DArray(char **array, int row) { 
    for (row -= 1; row >= 0; row--) 
     free(array[row]); 
    free(array); 
} 

void permute(int n, int fix, char **arr) { 
    int i, j; 
    char temp; 
    if (n == 0) { 
     for (j = fix - 1, i = 0; j >= 0; j--, i++) { 
      arr[row][i] = input[j]; 
     } 
     row++; 
    } 
    for (i = 0; i < n; i++) { 
     temp = input[i]; 
     for (j = i + 1; j < n; j++) { 
      input[j - 1] = input[j]; 
     } 
     input[n - 1] = temp; 

     permute(n - 1, fix, arr); 

     for (j = n - 1; j > i; j--) { 
      input[j] = input[j - 1]; 
     } 
     input[i] = temp; 
    } 
} 

int factorial(int n) { 
    if (n == 1) return 1; 
    return n * factorial(n - 1); 

} 


void quick_sort(char *array, int left, int right) { 
    if (left < right) { 
     int boundary = left; 
     for (int i = left + 1; i < right; i++) { 
      if (array[i] < array[left]) { 
       swapSort(array, i, ++boundary); 
      } 
     } 
     swapSort(array, left, boundary); 
     quick_sort(array, left, boundary); 
     quick_sort(array, boundary + 1, right); 
    } 

} 

void swapSort(char array[], int left, int right) { 
    char tmp = array[right]; 
    array[right] = array[left]; 

    array[left] = tmp; 
} 


int stringcmp(const void *a, const void *b) { 
    const char **ia = (const char **) a; 
    const char **ib = (const char **) b; 
    return strcmp(*ia, *ib); 
} 
+0

をところで - '8 + 1 * sizeof(char) 'が期待通りに動作しない – fukanchik

+1

@fukanchik乗算で' sizeof(char) 'を使うのは、* sin(x)sin(x)+ cos(x)cos(x)*のようなものです。 –

+0

申し訳ありませんが、valgrindはこのプログラムの問題をそのまま報告しませんでした。入力は何ですか? –

答えて

0

別に他のいくつかの小さな問題からあなたはなししかし、文字列を正しく逆コピーしているおかげでたくさん memmoryエラーは、私が取得されている、あります最後に0バイトを追加します。

if (n == 0) { 
    for (j = fix - 1, i = 0; j >= 0; j--, i++) { <<-- The problem is in this line 
     arr[row][i] = input[j]; 
    } 
    row++; 
} 

することはできません逆コピー行末あなたが後でそれを追加する必要がありますので、それは、最後に残るべきとマーカー:

if (n == 0) { 
    for (j = fix - 1, i = 0; j >= 0; j--, i++) { 
     arr[row][i] = input[j]; 
    } 
    arr[row][fix]=0; <<-- the fix 
    row++; 
} 
+0

それは、おかげで多くの仲間を助けた:) – prone666

関連する問題