C строк сравнении с знак равенства

у меня есть этот код:

char *name = "George"

if(name == "George")
   printf("It's George")

Я думал, что строки c нельзя сравнить с == знак, и я должен использовать strcmp. По неизвестной причине, когда я компилирую с gcc (версия 4.7.3), этот код работает. Я думал, что это было неправильно, потому что это похоже на сравнение указателей, поэтому я искал в google, и многие люди говорят, что это неправильно и по сравнению с == не может быть сделано. Так почему же этот метод сравнения работает ?

5 ответов


Я думал, что строки c нельзя сравнить со знаком==, и я должен использовать strcmp

право.

Я думал, что это было неправильно, потому что это похоже на сравнение указателей, поэтому я искал в google, и многие люди говорят, что это неправильно и сравнение с == не может быть сделано

это тоже верно.

Итак, почему этот метод сравнения работает ?

Это не "работа". Это только появляется работает.

причина, по которой это происходит, вероятно, оптимизация компилятора: два строковых литерала идентичны, поэтому компилятор действительно генерирует только один экземпляр из них и использует тот же самый указатель/массив всякий раз, когда ссылаются на строковый литерал.


просто чтобы предоставить ссылку на ответ @H2CO3:

C11 6.4.5 строковые литералы

Не указано, являются ли эти массивы различными при условии, что их элементы имеют нужных значений. Если программа пытается изменить такой массив, поведение не определено.

Это означает, что в вашем примере name(строковый литерал "George") и "George" может и не может совместно использовать одно и то же место, это до реализация. Поэтому не рассчитывайте на это, это может привести к другим результатам на других машинах.


сравнение, которое вы сделали, сравнивает расположение из двух строк, а не их содержание. Так получилось, что ваш компилятор решил создать только один строковый литерал, содержащий символы "George". Это означает, что расположение строки, хранящейся в name и расположение второго "George" одинаковы, поэтому сравнение возвращает ненулевое значение.

компилятор не требуется для этого, однако - это может быть так же, как легко создайте два разных строковых литерала с разными местоположениями, но одинаковым содержимым, и сравнение вернет ноль.


это не удастся, так как вы сравниваете два разных указателя двух отдельных строк. Если этот код все еще работает, то это результат тяжелой оптимизации GCC, которая сохраняет только одну копию для оптимизации размера.

использовать strcmp(). ссылке.


Если вы сравниваете два укуса, которые вы сравниваете базовые адреса этих строк, а не фактические символы в этих строках. для сравнения строк используйте strcmp() и strcasecmp() функции библиотеки или программы писать. ниже приведен не полный код, а только логика, необходимая для сравнения строк.

void mystrcmp(const char *source,char *dest)
{
    for(i=0;source[i] != '';i++)
        dest[i] = source[i];
   dest[i] = 0;

}