2017-09-20 11 views
4

私はプログラムを持っている配列を作成し、その乱数で塗りつぶします。次に、重複がないかどうかをチェックし、各重複が何回発生したかを出力します。 Memcheck以外のすべての作品は、39のエラーがあり、何が原因であるのかわからない(私はこの問題が繰り返し()メソッドから来ていると思います)と教えています。ランダムな数字で配列を塗りつぶすプログラムのメモリエラー

乾杯、 ハリー

コード -

#include <stdio.h> 
#include <stdlib.h> 
#include "random.h" 

int main(void) { 
    int array_size = 0; 
    int *my_array; 
    int i = 0; 

    printf("Enter the size of the array:\n"); 
    scanf("%d", &array_size); 

    my_array = malloc(array_size * sizeof my_array[0]); 
    if (NULL == my_array) { 
     fprintf(stderr, "memory allocation failed!\n"); 
     return EXIT_FAILURE; 
    } 

    for (i = 0; i < array_size; i++) { 
     my_array[i] = rand() % array_size; 
    } 
    printf("What's in the array:\n"); 
    for (i = 0; i < array_size; i++) { 
     printf("%d ", my_array[i]); 
    } 
    printf("\n"); 

    repeated(my_array, array_size); 

    free(my_array); 

    return EXIT_SUCCESS; 
} 

void repeated(int *my_array, int array_size) { 
    int *array_tracker; 
    int i; 

    array_tracker = malloc(array_size * sizeof array_tracker[0]); 

    for (i = 0; i < array_size; i++) { 
     array_tracker[my_array[i]]++; 
    } 

    for (i = 0; i < array_size; i++) { 
     if (array_tracker[i] > 1) { 
      printf("%d occurs %d times\n", i, array_tracker[i]); 
     } 
    } 

    free(array_tracker); 
} 

Memcheck出力 -

==23999== Memcheck, a memory error detector 
==23999== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al. 
==23999== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info 
==23999== Command: ./lab20c-prog 
==23999== 
==23999== Conditional jump or move depends on uninitialised value(s) 
==23999== at 0x40091F: repeated (random.c:15) 
==23999== by 0x400799: main (random.c:42) 
==23999== 
==23999== Conditional jump or move depends on uninitialised value(s) 
==23999== at 0x519148A: vfprintf (in /usr/lib64/libc-2.24.so) 
==23999== by 0x5199718: printf (in /usr/lib64/libc-2.24.so) 
==23999== by 0x40092E: repeated (random.c:16) 
==23999== by 0x400799: main (random.c:42) 
==23999== 
==23999== Use of uninitialised value of size 8 
==23999== at 0x518DD8B: _itoa_word (in /usr/lib64/libc-2.24.so) 
==23999== by 0x5192552: vfprintf (in /usr/lib64/libc-2.24.so) 
==23999== by 0x5199718: printf (in /usr/lib64/libc-2.24.so) 
==23999== by 0x40092E: repeated (random.c:16) 
==23999== by 0x400799: main (random.c:42) 
==23999== 
==23999== Conditional jump or move depends on uninitialised value(s) 
==23999== at 0x518DD95: _itoa_word (in /usr/lib64/libc-2.24.so) 
==23999== by 0x5192552: vfprintf (in /usr/lib64/libc-2.24.so) 
==23999== by 0x5199718: printf (in /usr/lib64/libc-2.24.so) 
==23999== by 0x40092E: repeated (random.c:16) 
==23999== by 0x400799: main (random.c:42) 
==23999== 
==23999== Conditional jump or move depends on uninitialised value(s) 
==23999== at 0x5192669: vfprintf (in /usr/lib64/libc-2.24.so) 
==23999== by 0x5199718: printf (in /usr/lib64/libc-2.24.so) 
==23999== by 0x40092E: repeated (random.c:16) 
==23999== by 0x400799: main (random.c:42) 
==23999== 
==23999== Conditional jump or move depends on uninitialised value(s) 
==23999== at 0x5191536: vfprintf (in /usr/lib64/libc-2.24.so) 
==23999== by 0x5199718: printf (in /usr/lib64/libc-2.24.so) 
==23999== by 0x40092E: repeated (random.c:16) 
==23999== by 0x400799: main (random.c:42) 
==23999== 
==23999== Conditional jump or move depends on uninitialised value(s) 
==23999== at 0x51915B9: vfprintf (in /usr/lib64/libc-2.24.so) 
==23999== by 0x5199718: printf (in /usr/lib64/libc-2.24.so) 
==23999== by 0x40092E: repeated (random.c:16) 
==23999== by 0x400799: main (random.c:42) 
==23999== 
==23999== 
==23999== HEAP SUMMARY: 
==23999==  in use at exit: 0 bytes in 0 blocks 
==23999== total heap usage: 4 allocs, 4 frees, 1,052,792 bytes allocated 
==23999== 
==23999== All heap blocks were freed -- no leaks are possible 
==23999== 
==23999== For counts of detected and suppressed errors, rerun with: -v 
==23999== Use --track-origins=yes to see where uninitialised values come from 
==23999== ERROR SUMMARY: 39 errors from 7 contexts (suppressed: 0 from 0) 

答えて

1

あなたはarray_trackerの内容を初期化することはありません。あなたがそうするとき:

array_tracker[my_array[i]]++; 

あなたは初期化されていない値を増やしています。そのため、初期化されていない値の使用について多くの苦情があります。

malloc()の代わりにcalloc()を使用して、領域を割り当て、すべての要素を0に初期化することができます。

array_tracker = calloc(array_size, sizeof array_tracker[0]); 
+0

「sizeof array_tracker [0]」とは何ですか?私は 'array_tracker'が初期化されるまで実際には' NULL'だったと思いましたか? –

+0

@AlejandroIvánまず、NULLにすることができますが、それは測定される要素です。次に、 'sizeof'は評価されていないコンテキストです。 – bipll

+0

@AlejandroIván 'sizeof'は値ではなく型を調べます。 – Barmar

関連する問題