Является ли следующий код 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 секунд с тех пор, как я начал набирать это:)