Подтвердить что ты не робот

В чем разница между str == NULL и str [0] == '\ 0' в C?

Я хочу знать разницу между str == NULL и str[0] == '\0':

int convert_to_float(char *str, double *num)
{
    if ((str == NULL) || (str[0] == '\0'))
        return(-1);

    *num = strtod(str, (char **)NULL);
    return(0);
}

Я использую gcc для Linux.

4b9b3361

Ответ 1

Важно помнить, что str на самом деле не является "строкой", а скорее указателем в ячейке памяти, где хранится char (часть строки).

Далее мы должны понять, как компилятор видит все эти элементы. Давайте посмотрим на их типы:

  • str имеет тип char * (буквально, "указатель на char" )
  • NULL - константа нулевого указателя (по крайней мере, в моей системе, ((void*)0))
  • '\0' является символьной константой (она действительно имеет тип int, но не беспокойтесь об этом, она обычно используется в контексте, который требует значения char)

См. * в char * и void *? Это говорит компилятору, что это типы указателей (что является причудливым способом сказать, что переменные этого типа не имеют значения, они просто указывают на него). Поэтому, когда компилятор видит char *str, он знает, что вы можете попросить сделать что-то вроде *str или str[0] (оба они делают то же самое). Мы вернемся к этому позже.

Вы видите, когда вы пишете str в программе на языке C, компилятор знает, что переменная с именем "str" хранится в ячейке памяти, например 0x0001. Созданный код переходит в 0x0001 и получает значение. Таким образом, если вы сделаете что-то вроде

str + 1

Затем компилятор будет генерировать код, который выглядит примерно так:

fetch the value from where str is stored (0x0001)
add 1 to that value

Что я уверен, что вы знаете. Итак, теперь должно быть очевидно, что говорит эта строка:

str == NULL

Так как NULL является константой нулевого указателя, эта строка проверяет, является ли str нулевым указателем (то есть указателем, который не указывает ни на что).

Поэтому компилятор обычно генерирует код следующим образом:

fetch the value from where str is stored
check if that value is 0

Помните, если хотите, мы сказали компилятору, что str действительно является типом указателя. Поэтому нам разрешено написать это:

*str

И это заставляет компилятор генерировать это:

fetch the value from where str is stored
now use that value as a memory address and fetch what is stored there

Итак, если str проведено 0x0200, мы получим значение из адреса памяти 0x0200. Обратите внимание, что компилятору все равно, действительно ли там хранится строка.

(Я предполагаю, что вы знаете, что str[0] совпадает с *str. Это упрощает объяснение того, что происходит.)

Как насчет этого?

*str == '\0'

Итак, эта строка действительно:

*str == (char) 0

Это заставляет компилятор генерировать это:

fetch the value from where str is stored
now use that value like a memory address and fetch the char that is stored there
check if the value of that fetched char is 0

Подводя итог:

  • Написание str == NULL указывает, указывается ли указатель str .
  • Написание *str == '\0' указывает, указывает ли указатель str на пустую строку (фактически, указывая на ячейку памяти с нулем).

( "Строка" по определению является "непрерывной последовательностью символов, заканчивающихся и включающих первый нулевой символ", поэтому, если самый первый символ строки равен '\0', то строка представляет собой пустую строку.)

Ответ 2

str==NULL указывает, является ли указатель NULL.

str[0]=='\0' указывает, имеет ли строка нулевую длину.

В этом коде тест:

if ((str == NULL) || (str[0] == '\0'))

используется для обнаружения случая, когда он равен NULL или имеет нулевую длину.


Обратите внимание на то, что короткое замыкание играет здесь ключевую роль: Точка теста - убедиться, что str является допустимой c-строкой длиной не менее 1.

  • Второй тест str[0] == '\0' будет работать, только если str не является NULL.
  • Поэтому первый тест str == NULL необходим, чтобы разразиться раньше, когда str равен NULL.

Ответ 3

По существу

  • str == NULL определяет, является ли str указателем NULL
  • str[0] == '\0' определяет, является ли str строка стиля c длиной 0

Когда вы их объединяете, вы проверяете, является ли оно NULL или пустым. Это позволяет функции устранить обе формы пустых данных в начале метода

Ответ 4

str == NULL проверка str - это NULL-указатель (указатель на никуда)

str[0] == '\0' (если не NULL-указатель), проверка первого элемента str имеет 0-значение (строка без символов только 0-завершена)

Ответ 5

str==NULL указывает, является ли строка NULL.

*str=='\0' указывает, имеет ли строка нулевую длину.

Примечание. Этот ответ представляет собой игру Mystical 15 second answer, которая имела str=='\0'. Конечно, изменения, сделанные в первые 3 или 4 минуты, не показаны, и он зафиксировал его ಠ_ಠ.

Ответ 6

str == NULL означает "str указывает на нулевой адрес памяти" (или любой другой адрес NULL в вашей системе). Обычно это означает, что строка вообще отсутствует.

str [0] == '\ 0' означает, что "первый символ str является символом нуля" (который отмечает конец строки). Это означало бы строку, но она пуста. Подумайте о пустом чаше и о чаше; та же идея.

На других языках вы можете написать str == null vs str == "". Они означают две разные вещи. Особенно важно понимать разницу в C, поскольку попытка использования указателя NULL приведет к сбою программы.

Ответ 7

str == NULL это означает, что строка, имеющая NO REFERENCE строки, потому что указатель имеет значение Null (означает, что адрес строки имеет значение null).

str[0] == '\0' - означает строку с длиной 0.

Пожалуйста, дайте мне знать, если что-то не так в этом объяснении или у вас все еще есть сомнения.

Ответ 8

str == NULL 

означает, что str не указывает на любой адрес = указатель пуст.

и str[0] == '\0' str указывает на действительный адрес, и эта строка проверяет, является ли первая char (т.е. str [0]) цифрой 0 (значение ascii '\ 0'), что означает конец Струна. то строка пуста. (в str нет символа: первый - это конечный символ)

Ответ 9

1 → str == NULL определяет, является ли str указателем NULL 2 → str[0] == '\0' определяет, является ли str строкой стиля 0 длины c

поэтому в этом if ((str == NULL) || (str[0] == '\0')) shortcircuiting оператора OR попадает в изображение, поскольку он гарантирует, что ни одна строка не указывает ни на что, ни на пустую строку.

Ответ 10

С# эквивалент:

if (string.IsNullOrEmpty(str))
{

}

Простым значением является строка NULL или пустая строка.