A memory error in a program that fills an array with random numbers

I have a program to create an array and fill it with random numbers. Then it checks for duplicates and displays how many times each duplicate is repeated. Everything works fine except Memcheck, tells me that there are 39 errors, and I cannot figure out what causes them (I think the problem comes from the repeat () method)

Cheers, Harry

The code -

#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 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 exit -

==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)
+4
source share
1 answer

You have never initialized content array_tracker. Therefore, when you do:

array_tracker[my_array[i]]++;

you increase the uninitialized value. This is why you get a lot of complaints about using uninitialized values.

calloc() malloc() 0.

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

Source: https://habr.com/ru/post/1686082/


All Articles