Hallo @all
ich bin gerade sehr verwirrt. Ich baue gerade wieder etwas c, dabei habe ich bemerkt, dass gcc und clang sich unterschiedlich verhalten.
Gegeben sei dieses simple Beispiel
Übersetze ich das ganze mit clang, ist fu nicht initialisiert, also zeigt der Pointer auf eine Adresse die es nicht gibt. Das verhalten finde ich richtig. Wenn ich das ganze dann durch die Function init jage, bekomme ich eine gültige Adresse für fu.
Übersetze ich mit gcc, ist fu irgendwie halb initialisiert. nach der Funktion init hat fu aber wieder wie vor dem Aufruf diesen halbgaren zustand. Hier mal der gdb auszug
Ich bin auf dieses verhalten aufmerksam geworden, weil ich gerade an anderer Stelle das Problem habe, dass mein Pointer, den ich genau wie im obigen Beispiel deklariere und initialisiere, nach der Initialisierung immer noch keinen gültigen wert hat. In diesem Fall übersetze ich jedoch mit clang, das im gezeigten Beispiel ja wie erwartet funktioniert.
Jetzt meine Frage, was mache ich falsch? Oder kann mir einer erklären was da los ist? Ich habe schon gefühlte 10000000 mal genau so einen Pointer übergeben und nach dem Rücksprung das Ergebnis gehabt, welches ich haben wollte. Ich kann mir das echt nicht erklären.
ich bin gerade sehr verwirrt. Ich baue gerade wieder etwas c, dabei habe ich bemerkt, dass gcc und clang sich unterschiedlich verhalten.
Gegeben sei dieses simple Beispiel
Code:
#include <stdio.h>
#include <stdlib.h>
struct test{
struct test *next;
char val;
struct test *prev;
};
typedef struct test kst;
void init(kst *tst){
tst = (kst *) calloc(1, sizeof(kst));
}
int append (kst *tst){
tst->next = (kst *) calloc(1, sizeof(kst));
}
int main()
{
kst *fu;
init(fu);
fu->val = 'x';
printf("%c", fu->val);
append(fu);
fu->next->val = 'Y';
printf("%c", fu->next->val);
return 0;
}
Übersetze ich das ganze mit clang, ist fu nicht initialisiert, also zeigt der Pointer auf eine Adresse die es nicht gibt. Das verhalten finde ich richtig. Wenn ich das ganze dann durch die Function init jage, bekomme ich eine gültige Adresse für fu.
Übersetze ich mit gcc, ist fu irgendwie halb initialisiert. nach der Funktion init hat fu aber wieder wie vor dem Aufruf diesen halbgaren zustand. Hier mal der gdb auszug
Code:
Breakpoint 1, main () at test.c:31
31 init(fu);
(gdb) print fu
$1 = (kst *) 0x40047e
(gdb) s
init (tst=0x40047e) at test.c:13
13 tst = (kst *) calloc(1, sizeof(kst));
(gdb)
14 }
(gdb) print tst
$2 = (kst *) 0x800c07040
(gdb) print *tst
$3 = {next = 0x0, val = 0 '\0', prev = 0x0}
(gdb) s
main () at test.c:33
33 fu->val = 'x';
(gdb) print fu
$4 = (kst *) 0x40047e
(gdb) print *fu
$5 = {next = 0x35ff00c308c48348, val = -2 '�', prev = 0x25ff00401f0f0020}
(gdb) s
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400695 in main () at test.c:33
33 fu->val = 'x';
(gdb)
Ich bin auf dieses verhalten aufmerksam geworden, weil ich gerade an anderer Stelle das Problem habe, dass mein Pointer, den ich genau wie im obigen Beispiel deklariere und initialisiere, nach der Initialisierung immer noch keinen gültigen wert hat. In diesem Fall übersetze ich jedoch mit clang, das im gezeigten Beispiel ja wie erwartet funktioniert.
Jetzt meine Frage, was mache ich falsch? Oder kann mir einer erklären was da los ist? Ich habe schon gefühlte 10000000 mal genau so einen Pointer übergeben und nach dem Rücksprung das Ergebnis gehabt, welches ich haben wollte. Ich kann mir das echt nicht erklären.