2010-09-12 3 views
5

NULL in C-Programmierung kann mir jemand sagen, wie NULL in C behandelt wird? Und die Ausgabe dieses Programms ist 3, wie mit NULL-Konzept?Schwierigkeit in NULL-Konzept in C?

#include <stdio.h> 

int main(void) { 
    int i; 
    static int count; 
    for(i = NULL; i <= 5;) { 
     count++; 
     i += 2; 
    } 

    printf("%d\n",count); 
    return 0; 
} 

Antwort

3

NULL ist nur ein Makro definiert in stdio.h oder eine Datei, die STDIO enthält. Es kann unterschiedlich als eine Variation von Null definiert werden.

Wenn Sie Ihren Code durch den C Pre-Prozessor (in der Regel cc -E) ausführen können Sie sehen, was es auf dem implemnentation übersetzt:

void main(){ 
    int i; 
    static int count; 
    for(i=((void *)0); i<=5 ;){ 
     count++; 
     i+=2; 
    } 
    printf("%d",count); 
} 

die nicht nur eine unnötige Verwendung von NULL aber ist wild un -idiomatic C-Code, würde gewöhnlichere sein:

int main(){ 
    int i; 
    int count = 0; 
    for(i = 0; i <= 5; i += 2){ 
     count++; 
    } 
    printf("%d\n",count); 
    return 0; 
} 
+0

BT-Ausgang ist 3 .. wie? –

+3

@me_eclair: es ist '3', weil Sie bis' 5' zählen, indem Sie '2' auf den letzten Teil der' for'-Schleife schauen. Es fügt '2' jeder Iteration hinzu, also' i' geht so: '0' ->' 2' -> '4' ->' 6'. Die Schleife wird nicht betreten, wenn "i == 6", so dass der Körper der Schleife nur 3 mal durchlaufen wird. –

+0

NULL ist in definiert. Sie müssen nicht einschließen. Insbesondere können Sie NULL in einer freistehenden Umgebung ohne (die nicht verfügbar sein sollte) verwenden. – alecov

1

NULL ist, sollte mit 0 synonym sein. Es wird korrekterweise verwendet, um einen Nullzeiger anzuzeigen.

In diesem Fall wird der Code tatsächlich sein:

for (i = 0; i <= 5) 
{ 
    count++; 
    i += 2; 
} 
+1

Korrektur, es hängt von der Standardbibliothek ab, nicht vom Compiler. Die Sprachspezifikationen für C und C++ sind sehr klar, was "NULL" sein kann. –

+0

@Evan - danke, es ist eine Weile her, dass ich C wütend gemacht habe. Antwort aktualisiert – ChrisF

21

Für C, "NULL" ist traditionell (* void) zu sein, definiert 0 - mit anderen Worten, es ist ein Zeiger alias Adresse 0. C++, "NULL" wird typischerweise als "0" definiert. Das Problem mit NULL in C++ und C ist, dass es nicht typsicher ist - Sie können bizarre Konstrukte wie die, die Sie in das Codebeispiel eingefügt haben, erstellen.

Für C++ haben die Sprachdesigner dies in C++ 0x durch Hinzufügen eines neuen "nullptr" -Typs korrigiert, der implizit in jeden beliebigen Zeigertyp konvertiert werden kann, aber nicht in einen Integer-Typ konvertiert werden kann.

+2

NULL ist kein Alias ​​für die Adresse 0 (dies könnte eine gültige Adresse sein). Es ist eine Ganzzahl * Konstante * Null in einem Zeigerkontext. – mpez0

+0

Es gibt kein Konzept von "Zeiger Null", da Zeigerzusatz kein Identitätselement hat. 'NULL' ist ein Makro, das zu einem kanonischen ungültigen Zeiger erweitert wird, der nicht stark typisiert ist. – Potatoswatter

2

NULL hat die meiste Bedeutung im Umgang mit Zeigern. Wenn Sie mit Ganzzahlen arbeiten, wäre es besser, einfach Null zu verwenden.

Streng genommen ist NULL einfach der Wert Null mit einem fantastischen Namen, aber der wichtigste Teil darüber ist in der Tat seine Phantasie Name. Es existiert, weil es weniger eindeutig ist, int* p = NULL; als int* p = 0; zu schreiben. Da wir wissen, NULL ist ein Zeiger, wir sind sicher, dass ich wirklich zu einem Zeiger meinte.

Also, wenn Sie mit Zeigern umgehen und die Adresse0, darstellen wollen NULL verwenden. Wenn Sie mit Zahlen arbeiten und die Nummer darstellen möchten, verwenden Sie 0. (In Ihrem Beispiel sollten Sie 0 anstelle von NULL verwenden.)

0

NULL ist definiert als 0 von C. In Ihrem Programm zählt es von 0 bis 5 (zählt jede zweite Zahl). Deshalb ist count 3 (i = 0, 2, 4).

NULL sollte nicht auf diese Weise verwendet werden. NULL sollte mit Zeigern verwendet werden.

0

die Art der NULL und die Art der i verschieden sind, aber C verzeiht man :)

C ist (meistens) keine "typsichere" Sprache. Ich meine: Sie können Typen mischen, die andere Sprachen beschweren würden.

Mit C Sie chars-doubles hinzufügen können, können Sie multiplizieren chars und ints, ...

Was Sie tun, ist ein null pointer constant (vom Typ void *) zu einem int zuweisen. C ermöglicht das, aber müssen Sie sehr vorsichtig sein, wenn Sie die Typen wie folgt mischen.

Das Ergebnis der Zuweisung der Nullzeigerkonstante zu einem Int entspricht der Zuweisung von 0. So starten Sie Ihre Schleife mit i ist 0.

Eine statische automatische Variable wird bei fehlendem Initialisierer auf 0 initialisiert. Dies geschieht mit der Variablen count in Ihrem Programm.

So geht die Schleife erste (count wird 1) mit i 0 ist, dann wird i 2.
Jetzt geht die Schleife (count wird 2) mit i 2 ist, dann i 4.
Nun wird die Schleife geht (count wird 3) mit i wird 4, dann i wird 6.
Und die Schleife beendet ... und Sie drucken den Wert count.


Hinweise

  • sein Standard-konform main sollte int main(void)
  • Sie deklariert werden ausgeben soll ein Newline nach jeder kompletten Linie (printf("%d\n", count);)
  • und Sie sollten return 0; erfolgreich, um anzuzeigen, Vervollständigung Ihres Programms zum Betriebssystem
+0

Danke U .. PMG Problem gelöst. –

0

Verwechseln Sie die Idee eines NULL-Zeigers in c nicht mit der eines nullbaren Typs oder Mengen in einigen dynamischen Sprachen. Es gibt ähnliche, aber unterschiedliche Verwendungszwecke und Bedeutungen.

In c dem Begriff der NULL ist nur nativ im Kontext des Zeigers, wo es ist ein Zeiger auf ein bekannt ungültig Speicherplatz (oft, aber nicht immer, vertreten durch Null) verwendet.

Dies ist nicht (ganz) dasselbe wie ein Typ oder eine Variable, die Nicht-Setness darstellen kann. Beachten Sie, dass solche Typen vom Benutzer in c definiert und verwaltet werden können, aber nicht von der Sprache geliefert werden.

3

Es gibt ein ganzes Kapitel, das dem Nullzeiger im C FAQ gewidmet wird, der alle Ihre Fragen beantworten sollte.

  • 5.1 Was ist dieser berüchtigte Nullzeiger überhaupt?
  • 5.2 Wie bekomme ich einen Nullzeiger in meinen Programmen?
  • 5.3 Ist der abgekürzte Zeigervergleich if(p) zum Testen auf Nicht-Null-Zeiger gültig?Was, wenn die interne Repräsentation für Nullzeiger ungleich Null ist?
  • 5.4 Was ist NULL und wie ist es definiert?
  • 5.5 Wie sollte NULL auf einer Maschine definiert werden, die ein Bitmuster ungleich Null als interne Darstellung eines Nullzeigers verwendet?
  • 5.6 Wenn NULL wie folgt definiert wurden: #define NULL ((char *)0). Würde das nicht Funktionsaufrufe machen, die ein uncast-NULL-Zeichen übergeben?
  • 5.7 Mein Anbieter stellt Header-Dateien zur Verfügung, die NULL als 0L definieren. Warum?
  • 5.8 Ist NULL gültig für Zeiger auf Funktionen?
  • 5.9 Wenn NULL und 0 als Nullzeiger-Konstanten gleichwertig sind, welche sollte ich verwenden?
  • 5.10 Aber wäre es nicht besser, NULL (statt 0) zu verwenden, falls sich der Wert NULL ändert, vielleicht auf einer Maschine mit internen Null-Zeigern ungleich null?
  • 5.11 Ich habe einmal einen Compiler verwendet, der nicht funktionieren würde, wenn NULL nicht verwendet wurde.
  • 5.12 Ich benutze das Präprozessor-Makro #define Nullptr(type) (type *)0, um mir zu helfen, Nullzeiger des korrekten Typs zu bauen.
  • 5.13 Das ist seltsam. NULL ist garantiert 0, aber der Nullzeiger ist nicht?
  • 5.14 Warum gibt es so viel Verwirrung um Nullzeiger? Warum tauchen diese Fragen so oft auf?
  • 5.15 Ich bin verwirrt. Ich kann das ganze Null-Zeiger-Zeug einfach nicht verstehen.
  • 5.16 Wäre es angesichts der Verwirrung um Nullzeiger nicht einfacher, sie einfach intern durch Nullen darzustellen?
  • 5.17 Ernsthaft, haben irgendwelche tatsächlichen Maschinen wirklich Null Null Zeiger oder verschiedene Darstellungen für Zeiger auf verschiedene Typen?
  • 5.18 Ist ein Laufzeit-Integralwert von 0 in einen Zeiger umgewandelt, der garantiert ein Nullzeiger ist?
  • 5.19 Wie kann ich auf einen Interrupt-Vektor zugreifen, der sich an der Position 0 der Maschine befindet? Wenn ich einen Zeiger auf 0 setze, könnte der Compiler es in einen internen Nullenzeigerwert ungleich null übersetzen.
  • 5.20 Was bedeutet ein Runtime-Fehler "Nullzeigerzuweisung"? Wie kann ich es aufspüren?