ожидаемый результат и практический результат не совпадают, пожалуйста, объясните логику кода - PullRequest
0 голосов
/ 20 ноября 2018
    #include<stdio.h>

    int main()

    {

    char *str[] = {"Frogs","Do","Not","Die.","They","Croak"};

    printf("%c %c %c",*str[0],*str[1],*str[2]);//expected F D N

    printf("\n%u %u %u",str[0],str[1],str[2]);//expected 1000 1006 1003

   }

этот вывод основан на предположении, что froak начинается с 1000

выход выглядит следующим образом

F D N

2162395060 2162395057 2162395053

как это возможно, здесь адрес уменьшаетсяstr[0] до str[2], печать адреса str[3], str[4], str[5], не показывает шаблон и скорее имеет резкие изменения в адресах

1 Ответ

0 голосов
/ 20 ноября 2018

Вы печатаете адреса трех строковых констант.Компилятор не обязан организовывать строковые константы любым предсказуемым образом.

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

Я запустил тот же код в Mac OS, используя AppleClang 10.0.0.10001044 и получил следующий вывод:

F D N
104431486 104431492 104431495

Как вы можете видеть, указатели используются последовательно AppleClang.

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

...