7 Stimmen

"Verwendung eines nicht initialisierten Wertes" trotz Memset

Ich weise ein 2d-Array zu und fülle es mit Nullen mit memset.

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

void main() {
    int m=10;
    int n =10;
    int **array_2d;
    array_2d = (int**) malloc(m*sizeof(int*));
    if(array_2d==NULL) {
        printf("\n Could not malloc 2d array \n");
        exit(1);
    }
    for(int i=0;i<m;i++) {
        ((array_2d)[i])=malloc(n*sizeof(int));
        memset(((array_2d)[i]),0,sizeof(n*sizeof(int)));
    }

    for(int i=0; i<10;i++){
        for(int j=0; j<10;j++){
            printf("(%i,%i)=",i,j);
            fflush(stdout);
            printf("%i ", array_2d[i][j]);
        }
        printf("\n");
    }
}

Danach verwende ich valgrind [1], um auf Speicherfehler zu prüfen. Ich erhalte folgenden Fehler: Conditional jump or move depends on uninitialised value(s) für Zeile 24 ( printf("%i ", array_2d[i][j]); ). Ich dachte immer, memset sei die Funktion zum Initialisieren von Arrays. Wie kann ich diesen Fehler loswerden?

Merci !

Valgrind-Ausgabe:

==3485== Memcheck, a memory error detector
==3485== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==3485== Using Valgrind-3.5.0-Debian and LibVEX; rerun with -h for copyright info
==3485== Command: ./a.out
==3485== 
(0,0)=0 (0,1)===3485== Use of uninitialised value of size 4
==3485==    at 0x409E186: _itoa_word (_itoa.c:195)
==3485==    by 0x40A1AD1: vfprintf (vfprintf.c:1613)
==3485==    by 0x40A8FFF: printf (printf.c:35)
==3485==    by 0x8048724: main (playing_with_valgrind.c:39)
==3485== 
==3485== 
==3485== ---- Attach to debugger ? --- [Return/N/n/Y/y/C/c] ---- 
==3485== Conditional jump or move depends on uninitialised value(s)
==3485==    at 0x409E18E: _itoa_word (_itoa.c:195)
==3485==    by 0x40A1AD1: vfprintf (vfprintf.c:1613)
==3485==    by 0x40A8FFF: printf (printf.c:35)
==3485==    by 0x8048724: main (playing_with_valgrind.c:39)

[1] valgrind --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes --db-attach=yes ./a.out

[gcc-cmd] gcc -std=c99 -lm -Wall -g3 playing_with_valgrind.c

15voto

Khaled Alshaya Punkte 90854

Bei dieser Linie:

/* sizeof(n*sizeof(int)) retuns a value of type size_t.
   This means you are initializing only sizeof(size_t) of the array. */
memset(((array_2d)[i]),0,sizeof(n*sizeof(int)));

So sollte es sein:

memset(((array_2d)[i]),0, n*sizeof(int));

4voto

Jay Punkte 23175

Ändern Sie die Aussage:

memset(((array_2d)[i]),0,sizeof(n*sizeof(int)));

になります。

memset(((array_2d)[i]),0,n*sizeof(int));

Sie sollten nicht mit einem sizeof dort. Es wird nur die Größe des Typs der Variablen zurückgegeben, was nicht das ist, was Sie wollen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X