PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit malloc() in C


Gast
2004-02-04, 18:51:51
Hallo,

ich habe Probleme mit malloc(). In meinem Programm wird einige hundert Mal dieser Code ausgeführt:

if ( (xyzlisti_neu=(xyzlisti_t *)malloc(sizeof(xyzlisti_t)))==NULL )
{
printf("Speicherplatzmangel.\n");
exit(1);
}


Dabei gibt es nie Probleme.

Wenn er (inklusive der gesamten Funktion, in der er sich befindet) allerdings in einem anderen Zusammenhang (der funktional allerdings exakt gleich verläuft) aufgerufen wird, stürzt das Programm mit einem Speicherzugriffsfehler ab.

Per GDB erfährt man das malloc() selbst abstürzt.


Program received signal SIGSEGV, Segmentation fault.
0x400ac219 in malloc () from /lib/libc.so.6


Da hab ich nun keinen Plan mehr, was ich da noch tun könnte. Ein Bug in malloc() erscheint mir extrem unwahrscheinlich.

Vielen Dank im Vorraus,
Uli

Gast
2004-02-10, 12:31:18
Muss ja nicht in malloc direkt sein, sondern kann zB auch durch einen Zeigerfehler irgendwo später im Code verursacht werden.

Gast
2004-02-10, 16:31:19
Wenn es einen Absturz in malloc gibt, dann ist die Speicherverwaltung des aktullen Programms kaput. (Es gibt ein paar Tools zum sowas automatisch zu finden. mpatrol z.b. aber oft ist es besser die Fehler mit einem Codereview zu finden)

Vielleicht Speicher doppelt freigegeben?
So wie:

x=malloc(10)
free(x)
free(x)

???

Oder, nicht allokierten Speicher freigegeben?

void foo()
{
char tmp[256];

free(tmp);
}

Oder, zu wenig Speicher allokiert?


x=malloc(strlen(y));
strcpy(x,y);

Da würde jetzt ein Byte fehlen .... und das macht die Speicherliste kaput. Da fehlt nämlich der Platz fürs Null-Byte. Richtig wäre malloc(strlen(y)+1). ... Oder gleich strdup();

Oder, hat vielleicht die Struktur: xyzlisti_t ein Array (char oder was sonst) und wird da vielleicht nicht geprüft, ob die Arraygrenze überschritten wird?

Oder, sind da vielleicht Zeiger in der Struktur, die in den Wald zeigen? malloc initialisiert den Speicher nicht. calloc(1, sizeof(xyzlisti_t)) würde ihn auf '0' initialisieren.