В C строковые значения (включая строковые литералы) представлены в виде массивов char
, за которым следует терминатор 0, и вы не можете использовать оператор ==
для сравнения содержимого массива;язык просто не определяет операцию.
За исключением случаев, когда это операнд оператора sizeof
или &
или когда это строковый литерал, используемый для инициализации другого массива в объявлении, выражение с типом "массив N-элементов"из T "будет иметь свой тип неявно преобразуется (распад) в тип" указатель на T ", а значением выражения будет адрес первого элемента массива.
Поэтому, когда вы пишете
if (argv[1] == "-hello")
, компилятор неявно преобразует выражение "-hello"
из типа "массив из 7 элементов char" в "указатель на char" (argv[1]
ужетип указателя), а значением выражения является адрес символа '-'
.Так что ==
сравнивает два значения указатель , которые (скорее всего) никогда не будут равны, поскольку "-hello"
и argv[1]
(скорее всего) занимают разные области в памяти.
Вот почему вы должны использовать библиотечные функции, такие как strcmp()
, для сравнения строковых значений.