Рейтинг:
2
OriginalGriff
Цитата:
Верно ли это равенство во всех версиях стандарта ISO C?
Да.
Адрес первого символа Строковой константы является указателем на саму строку, а имя массива-указателем на первый элемент этого массива.
Поскольку строка представляет собой массив символов, "bar" - это указатель на первый символ в строке, а адрес строки-также указатель на первый символ. Эти два вычисляются по одному и тому же адресу, поэтому два указателя идентичны.
Это будет то же самое во всех версиях C, даже если это выглядит так, как будто это должно быть неправильно!
Richard MacCutchan
За исключением того, что второй - это адрес указателя.
OriginalGriff
Нет, потому что это постоянная строка - и адрес строки является указателем на первый элемент в строке, а не адресом указателя на первый элемент. Поскольку это константа, адрес не хранится в памяти, это постоянный элемент.
Я же сказал, что это выглядит неправильно! :смеяться:
Richard MacCutchan
Запустите код.
OriginalGriff
Я сделал:
int main()
{
printf("Hello World\n");
if ((void *) "bar" == (void *) &"bar")
printf("Same\n");
else
printf("different\n");
return 0;
}
https://www.onlinegdb.com/online_c_compiler
Результат:
Всем Привет
То же
OriginalGriff
Все будет по-другому, если ваш компилятор автоматически не оптимизирует строковые константы (я думаю, что это опция-O, которая отключает это, но это было очень давно, и я могу ошибаться), но обычно она включена по умолчанию.
Richard MacCutchan
Да, /O1 отсутствовал.
KarstenK
В зависимости от того, что компилятор умный и делает только одну строку "bar" в exe и поэтому использует один и тот же адрес в сравнении. :-O
Рейтинг:
1
Patrice T
Цитата:
Верно ли это равенство во всех версиях стандарта ISO C?
Я бы предположил, что ответ также может быть "нет".
Чтобы получить ответ "true", ваш компилятор должен был определить, что обе строки одинаковы, и активировать оптимизацию, чтобы обе строки были объединены в одном и том же месте в исполняемом файле.
Вы не можете ожидать, что каждая версия каждого компилятора с любой комбинацией оптимизаций всегда будет вести себя одинаково.