Forum: Mikrocontroller und Digitale Elektronik Zeiger auf externe Variable zeigt auf falsche Adresse


von Stefan (Gast)


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

von Stefan (Gast)


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

von P. S. (Gast)


Lesenswert?

Mit einem uebersetzbaren Beispiel waere es einfacher, dir zu helfen. Oft 
verschwinden die Probleme naemlich mit dem "unnoetigen" weggelassenen 
Code...

von MichaelW (Gast)


Lesenswert?

Hallo Stefan,

extern int *a;

muß

extern int a[];

heissen. Ich würde aber eine Übergabe als Parameter bevorzugen.

von Stefan (Gast)


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

von Peter (Gast)


Lesenswert?

In der Tet, *a und a[] sind beides Pointer. Aber das zweite ist auch ein 
Array und das wird vom Compiler/Linker unterschieden...

von MichaelW (Gast)


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).

von Stefan E. (sternst)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.