Der Standard besagt, dass die Übergabe eines NULL
-Zeigers als Argument an ein printf
mit %s
-Spezifikator ein undefiniertes Verhalten 1 ist (dh alles kann passieren), also sind beide Verhaltensweisen zulässig.
Im ersten Fall tut dir die Standardbibliothek (insbesondere printf
code) einen Gefallen, indem du (null)
druckst.
Im zweiten Fall versteht der Optimierer stattdessen, dass Ihr printf
durch ein puts
ersetzt werden kann (was effizienter ist), ohne dass sich das "beobachtbare Verhalten" des Programms ändert, und ersetzt es . Aber, puts
enthält nicht den NULL
-Überprüfungscode von printf
, und daher erhalten Sie einen Segmentierungsfehler.
C99, §7.19.6.1, ¶8:
Das Argument soll ein Zeiger auf das Anfangselement eines Arrays von Zeichentypen sein.
¶9:
Wenn ein Argument nicht der richtige Typ für die entsprechende Konvertierungsspezifikation ist, ist das Verhalten nicht definiert.
Sie fallen in diesen letzten Fall, weil NULL
nicht "ein Zeiger auf das Anfangselement eines Arrays von Zeichentypen ist.
Tags und Links c segmentation-fault