| 

.NET C# Java Javascript Exception

2
Hallo liebe Gemeinschaft,

aktuell beschäftige ich mich mit C und GTK+3.

Meine Frage betrifft allerdings C. Vielleicht stehe ich einfach nur auf dem Schlauch. Aber ich möchte es verstehen.

Mein Betriebssystem ist derzeit LINUX Ubuntu 16.04.

Die folgende Funktion dient als Basis für meine Frage:

int example(char *_message)
{
char textValue;
char *_text = &textValue;

// Set default message if required
_text = (!_message)? "n/a" : _message;

printf("TEST: %s [%p]\n",_text,_text);

return 0;
}

Der Aufruf erfolgt in main() mit

example("Hello world!");

Was mich etwas verwirrt ist dass bei der Ausgabe, beziehungsweise dem Aufruf meines Programms (durch %p) immer die selbe Speicheradresse angezeigt wird (trotz Beenden und Neustart des Programms).

Ich habe gelesen dass Speicheradressen in der Regel variieren, was ja auch logisch ist.

Darum macht es mich doch etwas stutzig. Denn selbst wenn ich das Programm schließe und einige andere Anwendungen öffne, die dann ja im Grunde den Speicherplatz, beziehungsweise die Adressen einnehmen müssten die von meinem Programm belegt wurden, so ändert sich nichts wenn ich das Programm wieder starte.

Ich wäre dankbar wenn mir jemand das Bit hinter den Bytes zeigen würde. Denn entweder mache ich etwas falsch oder meine Logik ist nicht korrekt.

Danke.
News:
31.10.2016
Marc 11 1
3 Antworten
2
C ist schon etwas länger her, aber ich würde sagen es liegt daran, dass du keine Variable übergibst sondern eine Konstante. Die Position im Speicher wird bei Konstanten zur Compile-Time festgelegt, nicht zur Run-Time.

Versuch mal folgenden Code:
char *p = malloc(sizeof(char) * 20);
strcpy(p, "Hello World\n");
example(p);
example("Asdf\n");


Für "Asdf" wird immer die gleiche Adresse ausgegeben, für "Hell World" ändert sich die Adresse bei jedem Ausführen des Programms. Wenn du dann dein "Hello World" zu "Hello" änderst und neu compilierst, legt der Compiler "Asdf" an eine andere Speicheradresse.

Weiterführende Links:
http://www.geeksforgeeks.org/memory-layout-of-c-program/
http://stackoverflow.com/questions/12993435/why-are-constants-stored-in-the-text-segment-in-a-c-memory-map
01.11.2016
phg 1,6k 3
0
Danke das war im Grunde schon das fehlende Bit für mich. Die Adressen unterscheiden sich ja alleine schon im Bezug auf die Länge, was an sich auch interessant ist zu Wissen und einen unterschied erkennen lässt.

Also wird bezugnehmend auf mein Beispiel lediglich der Zeiger "*_message" der im Funktionskopf von "example()" entsteht und auf die Konstante "Hello world!" zeigt, die eine bei der Kompilierung fest zugeordnete Speicheradresse erhalten hat in den Speicher geschrieben.

Beim beenden des Programms wird der Zeiger aufgelöst, wie auch die Variablen und der Speicher ist somit wieder freigegeben.

Verstehe ich das so richtig?
01.11.2016
Marc 11 1
Zu Absatz 2: Ich würde es etwas anders formulieren, aber so wie du es schreibst hast du es anscheinend verstanden. Ich hab noch zwei Links an meine Antwort angehängt die das Speicherlayout erklären.

Zu Absatz 3: Beim beenden des Programms übernimmt das Betriebssystem, der komplette Speicher der dem Programm zugewiesen war wird vom Betriebssystem als freier Speicher übernommen - Zeiger, Konstanten, Variablen hören einfach auf zu existieren.

Btw. benutze bitte die Kommentieren-Funktion für weitere Fragen. Die Reihenfolge der Antworten kann sich durch Bewertungen ändern.
phg 02.11.2016
0
You will play roblox with full freedom after getting the robux codes which will be generated within a second and at no any effort through which you will find playing this game much more entertaining one.
05.11.2016

Stelle deine C-Frage jetzt!