2016-09-19 3 views
-3
#include <stdio.h> 
#include <unistd.h> 

int staticVar = 0; 

int main() 
{ 
    staticVar += 1; 

    sleep(10); 
    printf("Address: %x\nValue: %d\n", &staticVar, staticVar); 

    return 0; 
} 

Ich bin verwirrt, wie dieses Programm die Adresse der Variablen "staticVar" ausgibt. Vom Spiel mit dem Code bemerkte ich, dass, wenn Sie die Anweisung printf dazu ... ändernDemonstration des virtuellen Speichers mit C

printf("Address: %x\nValue: %d\n", staticVar, staticVar); 

Dann gedruckt wird der Wert der Variablen „staticVar“ in „Adresse“ Position.

Einige schnelle Forschung führte mich zu verstehen, dass die Hinzufügung von "&" bedeutete, dass die Variable "staticVar" referenziert wurde und dass der "% x" in der printf-Anweisung den Wert in hex ausgibt. Selbst mit dieser Information bin ich immer noch verwirrt, warum das funktioniert.

ich online lese auch, dass Sie mit dieser Zeile aus der Adresse zu einem gewissen Variable drucken können ...

printf("Address: %p\n", (void*) &staticVar); 

Gibt es Vorteil, um es auf diese Weise zu tun?

Ich brauche nur eine Erklärung, was das "&" Symbol effektiv tut.

+2

Wenn Sie '&' nicht verstehen, wie haben Sie versucht, den virtuellen Speicher zu verstehen? – immibis

+1

Ich dachte, dass das Lernen über Betriebssysteme cool klingt, also nahm ich ein Buch auf. Ich kenne C oder C++ nicht in einem beträchtlichen Sinn. Normalerweise lerne ich so oder so. Virtuelles Gedächtnis auf der Ebene, auf der ich mich befinde, ist rein konzeptionell. Im Moment interessiert es mich nicht zu wissen, wie das OS von einer virtuellen Adresse zu einer physischen Adresse wird, weil, wie ich lese, dies ein schwieriger Prozess ist. Auf der ganzen Linie werde ich aber. –

+0

Aktivieren Sie Warnungen und beheben Sie alle gemeldeten Warnungen. Ihr Code ruft undefiniertes Verhalten auf. '% x' ist ein ungültiger Konvertierungstyp für einen Zeiger! Bevor Sie mit der Arbeit an OS beginnen, wählen Sie ein Buch über C oder C++. Sie sind verschiedene Sprachen, also wählen Sie die Sprache, die Sie lernen möchten. Lernen Sie zuerst die Sprache, die OS-Programmierung. – Olaf

Antwort

2

Zuerst sollten Sie sich mit dem Konzept eines Zeigers vertraut machen. Zum Glück gibt es viele gute Referenzen da draußen like this (Die ersten 5 Abschnitte sind was wichtig ist).

Nach einigen Zeiger lesen, ist die untere Zeile, dass & ist ein Operator in C, die die Adresse der Variablen zurückgibt, die es vorausgeht. (Es kann tatsächlich zwei Verwendungen haben, abhängig vom Kontext, in dem es verwendet wird, der andere ist ein bitweiser UND-Operator, aber Sie sollten sich darüber keine Gedanken machen, bis Sie es verwenden müssen).

Auch sollten Sie immer% p verwenden, um einen Zeiger auszudrucken. Der Grund ist, weil es Ihren Code mehr portable to different operating systems macht.

printf("Address: %p\n", (void*) &staticVar); 

Dieser Code wird funktionieren, aber ich würde nicht auf einen void-Zeiger werfen, denn das Typumwandlung nicht erforderlich ist, und macht den Code weniger lesbar. Versuchen Sie es stattdessen.

printf("Address: %p\n", &staticVar); 
+0

Vielen Dank. Das hat mir enorm geholfen. –

+0

Bevor Sie mit Zeigern beginnen, sollte OP die Grundlagen richtig machen. Das heißt, ein strukturiertes Tutorial zu bearbeiten bzw. buchen (die meisten Online-Tutorials sind die Zeit nicht wert). – Olaf

+3

Ein paar Nits: Der Grund für die Verwendung von '% p' ist, dass ein Pointer in einigen Compilern möglicherweise nicht die gleiche Größe wie ein' int' hat (oft ist 'int' 32 Bit für 64-Bit-Code). Sie müssen ein 'int *' in 'void *' oder 'char *' umwandeln, wenn Sie eine Funktion wie 'printf()' mit einer variablen Anzahl von Argumenten aufrufen, sonst erhalten Sie undefiniertes Verhalten. Ein 'int *' ist nicht * erforderlich * so breit wie ein 'void *' zu sein! (OP, mach dir darüber keine Gedanken. Ich bin Sprachanwalt.) – Davislor

0

In diesem speziellen Kontext ersetzt das Symbol '&' effektiv jede Variable, die darauf folgt, mit der Adresse der Variablen.

+0

Von einem Test, den ich in C++ schrieb, und einem anderen in C, scheint die Aufnahme von "&" in eine druckähnliche Anweisung immer die Adresse zu drucken. Ist das richtig? Gibt es einen Fall, in dem die Einfügung von "&" der Variablen nicht die Adresse geben würde? –

+0

In C++ zeigt das Symbol '&' in einer Funktionsargumentdeklaration an, dass das Argument als Verweis und nicht als Wert übergeben wird. –

+0

@VictorHavin: Die Frage betrifft C, nicht C++. Sie sind verschiedene Sprachen, aber. '&' ersetzt nichts (das Konzept der Substitution ist mit Ausnahme des Präprozessors nicht einmal Teil der Kernsprache). – Olaf

Verwandte Themen