我分配了一个2d数组并使用memset用零填充它.
#include#include #include 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 之后我使用valgrind [1]来检查内存错误.我得到以下错误:
Conditional jump or move depends on uninitialised value(s)
第24行(printf("%i ", array_2d[i][j]);
).我一直认为memset是初始化数组的函数.我怎样才能摆脱这个错误?谢谢!
Valgrind输出:
==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
1> AraK..:在这一行:
/* 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)));它应该是:
memset(((array_2d)[i]),0, n*sizeof(int));