Zeiger auf externe Variable zeigt auf falsche Adresse

Gast #977193
Lesenswert?

Hallo zusammen,

ich habe folgendes Konstrukt:

main.c
------

#include "f.h"

int a[3]={1,2,3};

void main(void){
   f();
}

f.c
---

extern int a;

void f(void){

int *pa = a;
...
}

Nun zeigt pa jedoch nicht auf a sondern auf eine gänzlich andere 
Adresse.
Habe in der Literatur dazu nichts finden können.

Hat jemand einen Lösungsvorschlag?

Gruß,
Stefan
Gast #977201
Lesenswert?

Mal wieder zu schnell!

main.c
------

#include "f.h"

int a[3]={1,2,3};

void main(void){
   f();
}

f.c
---

extern int *a;

void f(void){

int *pa = a;
...
}

Nun zeigt pa jedoch nicht auf a sondern auf eine gänzlich andere
Adresse.
Habe in der Literatur dazu nichts finden können.

Hat jemand einen Lösungsvorschlag?

Gruß,
Stefan
Gast #979463
Lesenswert?

Morgen,

das war es in der Tat. Leider kann ich es nicht nachvollziehen, da beide 
Konstrukte für mich einen Pointer darstellen.

Hat jemand Lust und Muße zu einer kurzen Erklärung?

Gruß,
Stefan
Gast #979523
Lesenswert?

Hallo Stefan,

der Compiler findet *a nicht, weil du ja a[] definiert hast. Sehr wohl 
findet er aber a, und das ist in main.c die Zeigeradresse auf das erste 
Element von a[]

extern int *a in f.c dereferenziert nun den Zeiger: in a liegt aus der 
Sicht von f.c also nicht mehr der Zeiger sondern der erste Wert des 
Arrays (in diesem Fall 1).
#979562
Lesenswert?

> extern int *a;
Dort wo a im Speicher liegt, ist ein Pointer zu finden, der auf ein 
int zeigt.

> extern int a[];
Dort wo a im Speicher liegt, ist ein int-Array zu finden, also direkt 
der erste Wert vom Array.

Im ersten Fall wird also der erste Wert des Int-Arrays als Pointer auf 
einen anderen Int interpretiert.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren