0
void readdat (int c, char **v) {

char *dc;
char *pdc;

dc = malloc((line+1) * sizeof(char));
memset(dc, 0, (line+1) * sizeof(char));

FILE *datfile;
datfile = fopen(v[3], "r");

while(fgets(dc, line, datfile) != NULL) {
 pdc = strtok(dc, "\t");
 countcDat = 0;
 while(pdc != NULL) {
  ++countcDat;
  pdc = strtok(NULL, "\t");
 }
 ++countrDat;
}

dat = malloc(countrDat * sizeof(char**));
memset(dat, 0, countrDat * sizeof(char**));

for(i=0;i<countrDat;++i) {
 dat[i] = malloc(countcDat * sizeof(char*));
 memset(dat[i], 0, countcDat * sizeof(char*));
}

for(i=0;i<countrDat;++i) {
 for(j=0;j<countcDat;++j) {
  dat[i][j] = malloc(20 * sizeof(char));
  memset(dat[i][j], 0, 20 * sizeof(char)); ###
 }
}

rewind(datfile);

countrDat = 0;
countcDat = 0;

while(fgets(dc, line, datfile) != NULL) {
 pdc = strtok(dc, "\t");
countcDat = 0;
while(pdc != NULL) {
 sscanf(pdc, "%s", dat[countrDat][countcDat]);
 ++countcDat;
 pdc = strtok(NULL, "\t");
}
++countrDat;
}

for(i=0;i<countrDat;++i) {
 for(j=0;j<countcDat;++j) {
  printf("%s\t", dat[i][j]);
 }
 printf("\n");
}

fclose(datfile);
free(dc);
for(i=0;i<countrDat;++i) {
 for(j=0;j<countcDat;++j) {
  free(dat[i][j]);
 }
}
for(i=0;i<countrDat;++i) {
 free(dat[i]);
}
free(dat);
}

valgrindは、memsetでのサイズ1の無効な書き込みを示しています( "###"-マークされた行)。ここで何が悪いのかを理解するのを手伝ってください。valgrind出力の「アドレス0x0はスタックされておらず、mallocされておらず、解放されていません」に続いて、strtokが責任を負うことを除外できます。それはおそらく明らかです...

4

1 に答える 1

1

ここで何が間違っているのかを理解するのを手伝ってください。次の「アドレス 0x0 はスタックされておらず、malloc されておらず、解放されていません」

アドレスは からmallocのもので、malloc失敗する可能性があります。NULL失敗すると、アドレスを説明するが返され0x0ます。

失敗する理由mallocは、他の場所でメモリ リークを起こしている可能性があります。

于 2013-04-01T06:29:17.687 に答える