Zeiger auf externe Variable zeigt auf falsche Adresse

Gast #977193
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
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
Mit einem uebersetzbaren Beispiel waere es einfacher, dir zu helfen. Oft 
verschwinden die Probleme naemlich mit dem "unnoetigen" weggelassenen 
Code...
Gast
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
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).
> 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

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.