D
Ich schreibe eigentlich immer so was hier:
int my_errno;
void*pointer;
if(!(pointer=malloc(bla)) && (my_errno=errno))
return my_errno;
/*Und weiter ...*/
Das hat sogar den Vorteil, dass die aufrufende Funktion den Fehlercode zurückbekommt. Damit kannst du dann bestimmte Fehler abfangen, die die Funktion eventuell noch gerade so alleine machen kann.
Aber dass das keinen Laufzeitfehler verursacht, ist nicht garantiert. Weil in der Regel malloc schon einen Zeiger auf Speicherbereich zurückgibt, von dem der Kernel gesagt hat, dass er dafür Speicher reserviert. Das tut er aber (zumindest unter Linux) nicht sofort. Sondern erst dann, wenn dieser Speicher auch angefasst wird. Und wenn die Hardware dann einen Page Fault sendet und der Kernel merkt, dass er den versprochenen Speicher nicht bereitstellen kann, werden schon mal andere Prozesse gekillt oder dein Programm direkt beendet. Das würde ich in die Kategorie "Laufzeitfehler" mitnehmen.
EDIT: Ja, mir ist bekannt, dass errno nicht immer gesetzt werden muss. Aber ehrlich: wenn deine Laufzeitumgebung nicht den Fehlercode speichert, dann haben die Programmierer verkackt, die sie aufgezogen haben. Deswegen ist das auch ein "Test", um solche Umgebungen zu entdecken.