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'd或free'd”,我可以排除strtok负责。这很明显......
答案 0 :(得分:1)
请帮忙弄清楚这里有什么问题。以下“地址0x0没有堆叠,也没有malloc'd也没有自由”
嗯,地址来自malloc
,而malloc
可能会失败。如果失败,则会返回NULL
,其中会解释0x0
地址。
malloc
失败的原因很可能是你在其他地方泄露了内存。