何度も変更したこのコードに問題があります(ただし、エラーは常に表示されます)。 "filter"の最後のインデックスを解放する際にエラーが発生したようです。strange free()無効なポインタC
ここでchar** read_and_filter(int fd) {
char buf[MAXLENGTH];
char **bufs=NULL;
char ch;
int j = 0, len = 0, t = 0;
while (!t && read(fd,&ch,1) == 1) {
switch (ch) {
case '\n':
t = 1;
case ' ':
bufs = realloc(bufs, (j+1)*sizeof(char*));
bufs[j++] = strndup(buf,len);
memset(buf,0,len);
len = 0;
break;
default:
buf[len++] = ch;
}
}
bufs[j] = 0;
return bufs;
}
int main(int argc, char **argv) {
char **filter;
int i,fd = open("input.txt",O_RDONLY);
filter = read_and_filter(fd);
for(i = 0; filter[i]; i++) {
printf("%s\n",filter[i]);
free(filter[i]);
}
return 0;
}
が出力されます:
0x1521030
HOME
0x1521050
2
0x1521070
A
0x1521010
8
0x15210c0
D
*** Error in `./test': free(): invalid pointer: 0x00000000015210c0 ***
私もvalgrindのとそれをデバッグしようとした(?それは文字の合計が8である、奇妙なノーながらアロケータは9バイトを解放しようとすることを私に言います) gdbしかし何も働かなかった。 INPUT.TXTの 最初の行は "HOME 2 A 8 Dの\ n" は
文書化されていない変数名は子猫を泣かせます。 'j'? 't'?コードを読む時間を取っているときにそれらを理解するのは簡単ですが、合理的な命名で簡単にすることができます。たとえあなたが自分で簡単に気にしなくても、他の人に報酬なしであなたの問題を助けようとしているときは、仕事をできるだけ簡単にするために他人に借りなければなりません。それを超えて、あなたの出力はあなたが提供したプログラムと一致していないようです。表示されているコードが印刷しない各文字列の前にポインタ値が表示されます。 – mah
これらのステートメントは、 'buf [len ++] = ch;'を解放する際に問題を生じました。ポインタが指しているものに変更するとき。 – ameyCU
@ameyCUうーん、いいえ、どんな形でもポインタを変更しません。 –