mikrocontroller.net

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


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: P. S. (Gast)
Datum:

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

Autor: MichaelW (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Stefan,

extern int *a;

muß

extern int a[];

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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

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

Autor: MichaelW (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.