Почему между двумя указателями есть разница в 16 байтов вместо 8? - PullRequest
0 голосов
/ 20 сентября 2018
#include <stdio.h>

int main() {    
    const char *myarr[7];

    myarr[0] = "1st array";
    myarr[1] = "2nd array";
    myarr[2] = "3rd array";
    myarr[3] = "4th array";
    myarr[4] = "5th array";
    myarr[5] = "5";
    myarr[6] = "6";

    printf("\n%p", myarr[0]);   /*00007FF749919C18*/
    printf("\n%p", myarr[1]);   /*00007FF7B3C89C28*/

    printf("\n%p", myarr[5]);   /*00007FF749919C14*/
    printf("\n%p", myarr[6]);   /*00007FF7B3C89C24*/
}

Я комментировал адреса, когда печатал их значения в коде выше.Разница между адресами, хранящимися в 0-м и 1-м индексированных указателях, составляет 16 байт .

Сначала я подумал, что это потому, что строка, которую я им назначаю, составляет 9 символов, что больше, чем 8 байт., он не помещается в 8-байтовый блок, поэтому он расширяется до 16 байтов .Чтобы проверить это, я указал на закороченную строку в 5-м и 6-м индексах, но, как вы видите, адреса все еще имеют 16-байтовую разницу между ними.

Поскольку у меня есть 64-битная система Разве не должно быть 8 байт между адресами 5-й и 6-й точек указателей?

Ответы [ 2 ]

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

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

printf ("\ n% p", myarr [0]);

Распечатает адреспервый символ первого текста, который может быть где угодно.

Я думаю, что вы хотели сделать, это

printf("\n%p", &myarr[0]);

Это напечатает адрес указателя на первый текст.Таким образом, выходные данные

printf("\n%p", &myarr[0]);   
printf("\n%p", &myarr[1]);   
printf("\n%p", &myarr[2]);   
printf("\n%p", &myarr[3]);   
printf("\n%p", &myarr[4]);   
printf("\n%p", &myarr[5]);   
printf("\n%p", &myarr[6]); 

будут давать результат, который, я думаю, вы ожидаете.

Пример вывода:

0x7ffe3bfe9a10

0x7ffe3bfe9a18

0x7ffe3bfe9a20

0x7ffe3bfe9a28

0x7ffe3bfe9a30

0x7ffe3bfe9a38

0x7ffe3bfe9a40

* 1033
0 голосов
/ 20 сентября 2018

myarr[0] указывает на первый элемент "1st array"

myarr[1] указывает на первый элемент "2nd array"

Они не могут возможно быть 8друг от друга.

Но будьте уверены, что &myarr[1] - &myarr[0] будет sizeof(char*).

Обратите внимание, что ваши напечатанные адреса не разделены на 16 байтов: первый набор отличается на 5-м шестнадцатеричном значащем значении,например.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...