Thread C, malloc, realloc, int arrays und segfaults (6 answers)
Opened by FoolAck at 2009-01-27 05:24

FoolAck
 2009-01-27 05:24
#118371 #118371
User since
2008-05-02
69 Artikel
BenutzerIn
[default_avatar]
Hallo.
Erstmal sorry für den komischen Titel, aber ich weiß halt wirklich nicht worans hier liegt...
Ich lese eine Datei char für char in ein int-Array (ja, ich weiß, 3 Bytes verschenkt pro int) und lasse dieses bei Bedarf anwachsen.
Es segfaulted jedoch ab einer bestimmten Größe (/array Position) immer.
Hier ein so gut wie möglich gekürztes Beispiel:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <stdio.h>
#include <stdlib.h>

int *getinp(const char *filename);


int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, "Usage: %s <file>\n", argv[0]);
exit(EXIT_FAILURE);
}

int *foo = getinp(argv[1]);
return 0;
}

int *getinp(const char *filename) {
FILE *fd = fopen(filename, "r");
if (fd == NULL) {
fprintf(stderr, "Couldn't open %s for reading\n", filename);
exit(EXIT_FAILURE);
}

int pos = 0;
int size = 64;
int *arr = malloc(size * sizeof(int));
if (arr == NULL) {
fprintf(stderr, "Not enough memory\n");
exit(EXIT_FAILURE);
}
char c;

while ((c = fgetc(fd)) != EOF) {
arr[pos] = c;
pos++;
if (pos >= (size - 1)) {
size *= 2;
if (realloc(arr, size * sizeof(int)) == NULL) {
fprintf(stderr, "Not enough memory\n");
exit(EXIT_FAILURE);
}
}
}
arr[pos] = '\0';
fclose(fd);
return arr;
}



In gdb:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ gdb --args ./a.out big.bad.testfile
[gdb]> run
Starting program: /home/user/a.out big.bad.testfile

Program received signal SIGSEGV, Segmentation fault.
0x08048646 in getinp (filename=0xbf9c75b1 "big.bad.testfile") at fail.c:34
34 arr[pos] = c;
[gdb]> p size
$1 = 65536
[gdb]> p pos
$2 = 33700
[gdb]> p arr[pos-1]
$3 = 9
[gdb]> p arr[pos]
Cannot access memory at address 0x806b000


pos ist 33700, size ist 65536, arr[pos-1] ist lesbar, arr[pos] aber nicht. Dies ist zu 100% reproduzierbar (bei meinen Versuchen zumindest). Woran liegts? Irgendwie seh ich den Fehler nicht.
Ich meine, wenn malloc() oder realloc() fehlschlagen würden, würde das Script abbrechen und schreien. Tut es aber nicht. Laut der Logik sollte der Speicher eigentlich für das Array reserviert sein.
Ideen?

View full thread C, malloc, realloc, int arrays und segfaults