Чтобы прояснить точку, я написал две небольшие тестовые программы, приведенные ниже.Странное поведение при проверке символа NULL в 'C'
#include <stdio.h>
int main(int argc, char *argv[])
{
char *p = "ab";
p++;
p++;
if (*p)
printf("p is not NULL \n");
else
printf("ps is NULL \n");
return 0;
}
выше Программа initalizes указатель обугленного p
на строку буквального ab
. Я увеличиваю указатель дважды, а затем цикл if проверяет, указывает ли p
символ не-NULL. Это работает отлично и дает следующий вывод.
ps is NULL
#include <stdio.h>
int main(int argc, char *argv[])
{
char *p = '\0';
if (*p)
printf("p is not NULL \n");
else
printf("ps is NULL \n");
return 0;
}
выше программа инициализирует указатель символ p
на NULL символ \0
.Если я скомпилировать и запустить программу, я получаю сегментация fault.Can кто-то объяснить это?
Единственная разница в двух случаях: символ NULL находится в позиции 0
и позиции 2
. В противном случае программа выглядит идентично мне.
'char * p = '\ 0'; 'устанавливает значение p в NULL. Он * НЕ * инициализирует p, чтобы указать на NULL. ПРЕДЛОЖЕНИЕ: попробуйте 'char * p =" \ 0 "; 'или' char * p = ""; '. Попробуйте просмотреть сборку (gcc -S в Linux или cl/Fa в Windows). – paulsm4
Вы ссылаетесь на нулевой указатель. – ssnobody
'NULL символ находится в позиции 0':' char * p = ""; ' – BLUEPIXY