Forum: Compiler & IDEs verständnissfrage


von VLplayer (Gast)


Lesenswert?

hallo,
ich habe eine verständnissfrage.
und zwar wenn ich mit hilfe einer funktion eine große datenmenge ,welche 
in einen lokalen array sind, zurückgeben möchte und ich dazu nur die 
adresse des arrays an das aufrufende programm geben . klappt das???

von Oliver (Gast)


Lesenswert?

Nö. Das lokale Array gibt es nach Verlassen der Funktion nicht mehr, 
ergo zeigt deine Adresse ins Nirwana.

Oliver

von Thomas W. (thomas100)


Lesenswert?

Nein. Das Array wird ja zerstört, sobald die Funktion verlassen wird. 
Ein Zeiger auf das Array wäre also nicht mehr gültig.

Entwerder zu erzeugst das array dynamisch, also z.B. mit malloc() bzw. 
mit new, falls du mit C++ programmierts und gibts dann den Zeiger 
zurück.
Oder du erzeugst das Array in der aufrufenden Funktion und übergibst 
einen Zeiger (noch besser Referenz bei C++) an die Funktion, die die 
Daten dann rein schreibt.

Gruß
Thomas

von VLplayer (Gast)


Lesenswert?

vielen dank
und wenn ich nun ein großes array an eine fkt als parameter übergeben 
wil so dass sich die daten in der funktion nicht ändern.
wie mache ich das

von Thomas W. (thomas100)


Lesenswert?

genau so. Du schreibst einfach nichts in da Array. Lesen kannst du ja.
Sicherheitshalber kannst du den Parameter noch als "const" deklatieren. 
Dann bekommst du eine Compilermeldung, wenn du versuchst, das Array zu 
verändern.

Gruß
Thomas

von Winfried J. (Firma: Nisch-Aufzüge) (winne) Benutzerseite


Lesenswert?

global static ??

von Thomas W. (thomas100)


Lesenswert?

So z.B.:
1
void ftk (const char* arr)
2
{
3
   arr[0] = 0; //Fehler!!
4
}
5
6
char x[100];
7
ftk (x);

Wie groß dein Array ist, spielt dabei keine Rolle!

@Winfried J.:
Mit static beschränkst du dich aber auf eine Datei und verhinderst 
nicht, dass die Daten verändert werden!
VLplayer wollte aber wissen, wie man das ganze an eine Funktion 
übergibt.

Gruß
Thomas

von Winfried J. (Firma: Nisch-Aufzüge) (winne) Benutzerseite


Lesenswert?

"global" sollte es vonn überall erreichbar machen
"static" rettet das array von einem Aufruf zum Nächsten

gegen überschreiben ist es so zwar nicht geschützt

Aber der Zugriff per Zeigerübergabe ist möglich. Was die funktion damit 
macht bestimmt deren Funktionsdefinition. Nur das Array zerstören 
(destroy) kann sie nicht. Lediglich dessen Inhalt kann sie muss sie aber 
nicht ändern.

"const" bringt nur etwas wenn der Arrayinhalt nie verändert werden soll!

Ein Datensatz welcher bereits in einem Array vorliegt in ein locales 
const Array zu kopieren frist nur Rechenzeit und Speicher.

von Thomas W. (thomas100)


Lesenswert?

> "global" sollte es vonn überall erreichbar machen

Nur dass ich richtig bin. Wir reden hier von C?
Weder in C noch C++ kenn ich eine "global"-Definition.

> "static" rettet das array von einem Aufruf zum Nächsten
"static" beschränkt den Zugriff der Variable auf das aktuelle Modul. Ein 
Zugriff über "extern" von einem anderen Modul ist nicht möglich.

> Aber der Zugriff per Zeigerübergabe ist möglich. Was die funktion damit
> macht bestimmt deren Funktionsdefinition. Nur das Array zerstören
> (destroy) kann sie nicht. Lediglich dessen Inhalt kann sie muss sie aber
> nicht ändern.

Du kannst in einer Funktion dynamisch erzeugte Arrays sehr wohl 
zerstören, die durch einen Pointer übergeben wurden!

> "const" bringt nur etwas wenn der Arrayinhalt nie verändert werden soll!

Genau darum gehts VLplayer ja. Und um sicher zu sein, dass er nicht 
versehentlich doch rein schreibt, kannn er den Parameter "const" machen. 
Dann bekommt er beim compilieren eine Fehlermeldung.

> Ein Datensatz welcher bereits in einem Array vorliegt in ein locales
> const Array zu kopieren frist nur Rechenzeit und Speicher.

Hat ja auch niemand gesagt. Deswegen soll er ja einen Zeiger übergeben!

von Klaus (Gast)


Lesenswert?

@VLplayer: Schonmal was von Groß- und Kleinschreibung gehört?

von Rolf Magnus (Gast)


Lesenswert?

Winfried J. schrieb:
> "global" sollte es vonn überall erreichbar machen

Wozu?

> "static" rettet das array von einem Aufruf zum Nächsten

Das klingt, als ob du das auf eine lokale Variable beziehst, nicht auf 
eine globale.

> "const" bringt nur etwas wenn der Arrayinhalt nie verändert werden soll!

Falsch.

> Ein Datensatz welcher bereits in einem Array vorliegt in ein locales
> const Array zu kopieren frist nur Rechenzeit und Speicher.

Warum sollte man ihn kopieren? Man übergibt einfach einen Zeiger auf 
const, schon ist es dort, wohin man es übergibt, nicht beschreibbar.

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.