PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Pointer in Struktur gibt Fehler beim free()en



sticky bit
08-12-2004, 15:29
Folgender Beispiel Source


/*
typedefs
*/
typedef struct {
int number;
char *string;
} t_structure;

/*
prototypes
*/
t_structure *function();

/*
main
*/
int main (int argc, char **argv)
{
t_structure *structure;

structure = function();

printf("%i (%p), %s (%p) {%p}\n",
structure->number,
&structure->number,
structure->string,
structure->string,
structure);

free(structure->string); // und hier gibts Ärger...
free(structure);

return(0);
}

/*
function
*/
t_structure *function ()
{
t_structure *structure;

structure = malloc(sizeof(t_structure));
structure->number = 123;
structure->string = malloc(sizeof(char) * 8);
structure->string = "Hello";

return(structure);
}

erzeugt kompiliert die Ausgabe


123 (0x3c005030), Hello (0x3c000018) {0x3c005030}
test in free(): warning: junk pointer, too low to make sense.

Betriebssystem ist übrigens ein OpenBSD, Compiler ein gcc 2.95.3.

Was mir jetzt nicht in den Kopf geht ist die Sache, dass ich den Pointer in der Struktur nicht mehr free()en kann und wieso dessen Addresse vor der Adresse des Pointer auf die Struktur ist (was mir wiederum Wurst wäre wenn ich die Warnung nicht bekommen würde). Ist schwer da was zu finden glaube ich hab da nen generellen Denk- / Vorgehensfehler drinne, einer von Euch weiss bestimmt was da Sache ist... :)

wraith
08-12-2004, 15:38
Der Fehler liegt hier


structure->string = malloc(sizeof(char) * 8);
structure->string = "Hello";

Du setzt structure->string auf ge'malloc'ed Speicher, um ihn dann eine Zeile später auf ein konstantes Zeichenkettenliteral zeigen zulassen.
Der Speicher ist weg, und free ist in dem Fall nicht erlaubt.
Benutze strcpy.

Und bei printf fehlen zwei Casts.


printf("%i (%p), %s (%p) {%p}\n",
structure->number,
(void*)&structure->number,
structure->string,
structure->string,
(void*)structure);

%p erwartet void-Pointer.

sticky bit
08-12-2004, 18:09
Cool, Danke auf so was wäre ich natürlich wieder nicht gekommen, aber Erklärung ist logisch und leuchtet ein!
Auf jeden Fall vielen Dank!