ich ein Problem mit diesem Stück Code, das ich oft (aber der Fehler immer erschienen) geändert: Es scheint, es hat einen Fehler bei der Freigabe des letzten Index der „Filter“seltsam free() ungültiger Zeiger 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;
}
Hier ist die Ausgabe:
0x1521030
HOME
0x1521050
2
0x1521070
A
0x1521010
8
0x15210c0
D
*** Error in `./test': free(): invalid pointer: 0x00000000015210c0 ***
ich es auch mit valgrind zu debuggen versucht, (es sagt mir, dass der allocator 9 Byte, während die Summe der Zeichen zu befreien versucht, 8, seltsam oder?) und gdb aber nichts hat funktioniert. Die erste Zeile ist input.txt "HOME 2 A 8 D \ n"
Variablennamen, die keinen Dokumentationswert haben, lassen Kätzchen weinen. 'j'? 't'? Ok, einfach genug, um sie herauszufinden, wenn man sich die Zeit nimmt, den Code zu lesen, aber man kann es mit vernünftiger Benennung leichter machen. Selbst wenn es Ihnen nicht darum geht, es einfacher zu machen, wenn Sie andere Menschen bitten, mit Ihrem Problem ohne Entschädigung zu helfen, sind Sie es ihnen schuldig, die Aufgabe für sie so einfach wie möglich zu machen. Darüber hinaus scheint Ihre Ausgabe nicht mit dem von Ihnen bereitgestellten Programm übereinzustimmen. Es gibt scheinbar vor jeder Zeichenfolge Zeigerwerte, die von Ihrem Code nicht angezeigt werden. – mah
Diese Anweisungen verursachten beim Freigeben ein Problem - 'buf [len ++] = ch;'. Wenn Sie zu dem wechseln, auf was der Zeiger zeigt. – ameyCU
@ameyCU Umm, nein, das ändert keine Zeiger in irgendeiner Weise –