Является ли следующий код C безопасным?

#include<cstdio>
#include<stdlib.h>

int main()
{
    char* ptr=NULL;
    printf("%s",ptr);
    return 0;
}

Он выводит (null) в качестве вывода. Вышеприведенный пример. В реальном коде я получаю char * как возврат функции, и я хочу напечатать строку символов для ведения журнала. Тем не менее, NULL также является допустимым возвращаемым значением этой функции, и поэтому мне интересно, нужна ли нулевая проверка перед печатью символьной строки?

char* ptr=someFuncion();
// do i need the following if statement?
if(ptr!=NULL)
{
  printf("%s",ptr);
}

Я просто хочу быть уверенным, что вывод будет таким же, т.е. если ptr = NULL, тогда вывод должен быть (null) на всех платформах и компиляторах, а приведенный выше код (без оператора if) не будет аварийно завершен на любой совместимой с C платформе.

Короче говоря, приведенный выше код (без оператора if) совместим?

Спасибо за вашу помощь и терпение:)

Привет

Lali

Ответ 1

Короче говоря, приведенный выше код (без утверждение if) стандартно совместимо?

Нет. ISO/IEC 9899: 1999 (стандартный документ C) не делает никаких заявлений о том, что должно произойти, если ptr равно NULL, поэтому поведение undefined. Библиотека, которую вы использовали, просто была достаточно дружественной, чтобы дать вам полезный вывод ( "(null)" ) вместо сбоя.

Включить явную проверку для NULL.

Ответ 2

Вы имеете в виду что-то вроде этого?

  char* result = foo ();
  printf ("result is %s\n", (result ? result : "NULL"));

Ответ 3

В случае сомнений вы не должны полагаться на детали реализации и выполнять дополнительные (ptr != NULL) - это также хорошая практика кодирования.

Ответ 4

Обычно вы будете в ясном виде без if-утверждения, по моему опыту, хотя я стараюсь избегать делать то, что вы проиллюстрировали по привычке... это было давно, но IIRC компиляторы Sun, которые я использовал работа с будет приводить к сбою некоторое или все время, если вы передали NULL char * в printf(), поэтому просто проще и безопаснее включить проверку... Я собирался вставить примечание об использовании макро-форма, но я вижу, что меня избили ее, как 3 других человека за 30 секунд с тех пор, как я начал набирать это:)