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... :)
/*
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... :)