2017-01-03 2 views

Antwort

2

Diese Aussage gibt keine Kompilierung Fehler in c

Da es keine syntaktischen Fehler oder Einschränkungsverletzung ist, dass Compiler zu urteilen werden soll. C prüft nicht auf Arrays (oder Zeigerarithmetik).

Sie können einen Code schreiben, der ungültigen Speicher verwendet (Beispiel: einen ungültigen Speicherort dereferenzieren), aber falls der Compiler eine Binärdatei für solchen Code erstellt hat, würde die Ausführung der Binärdatei aufrufen undefined behaviour.

noch, wenn ich das Programm ausführen, gibt es einen Laufzeitfehler

in Ihrem Code

int *A [10]; 

A ist ein Array von 10 int * s, und sie sind nicht explizit initialisiert. Aus dem Ausschnitt zu sehen, scheint A nicht im globalen Bereich, d. H. Nicht static Speicher, so dass der Inhalt jedes dieser Zeiger unbestimmt sind.

Also, später in Prozess A[2][3]=15; zu schreiben, Sie versuchen zu ZugangA[2] (ein Zeiger), der mit einem ungültig Speicher verweist. Dies ruft undefiniertes Verhalten auf.

+0

'A [2]' ist ein gültiges Element des Arrays 'A' ... Der Wortlaut in Ihrem letzten Satz kann besser sein – StoryTeller

+0

@StoryTeller richtig, aber es zeigt nicht auf irgendeinen gültigen.Bitte vorschlagen oder fühlen Sie sich frei zu bearbeiten, keine Sorgen. :) –

+1

@StoryTeller Danke, ich habe auch ein wenig mehr hinzugefügt. :) –

1

Da der Zugriff auf den nicht initialisierten Zeiger A[2]undefined behavior aufruft, bedeutet dies, dass alles möglich ist, was den C-Standard betrifft.

warum kein Fehler der Kompilierung

ist, weil der Standard erfordert keine Diagnose (wie ein Compiler-Fehler), die in diesem Fall ausgegeben werden.

+0

Ich würde argumentieren, dass eine bessere Formulierung wäre * "nicht initialisierter Zeiger ** bei ** A [2]" *. Aber ich bin es nur. – StoryTeller

0

Es ist aus dem gleichen Grund, dass

int a, d = 0; 

a = 1/d; 

sauber kompiliert. Um die ungültige Operation zu erkennen, müsste der Compiler das Programm ausführen.

Verwandte Themen