magnomagna Ответов: 3

Что говорит об этом стандарт Си?


(void *) "bar" == (void *) &"bar"


Верно ли это равенство во всех версиях стандарта ISO C?

Что говорит об этом стандарт ISO C?

Что я уже пробовал:

Равенство верно при использовании gcc и следующих стандартов: c89, c90, c99, c11, c17, c2x.

CPallini

Стандарт говорит: "Ты, плохой, плохой, плохой парень!" :-)

3 Ответов

Рейтинг:
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

Richard MacCutchan

Цитата:
Что говорит об этом стандарт ISO C?
Вы можете узнать это, прочитав его.


Рейтинг:
1

Patrice T

Цитата:
Верно ли это равенство во всех версиях стандарта ISO C?

Я бы предположил, что ответ также может быть "нет".
Чтобы получить ответ "true", ваш компилятор должен был определить, что обе строки одинаковы, и активировать оптимизацию, чтобы обе строки были объединены в одном и том же месте в исполняемом файле.
Вы не можете ожидать, что каждая версия каждого компилятора с любой комбинацией оптимизаций всегда будет вести себя одинаково.