为什么两个指针之间有16个字节的差异而不是8个字节?

时间:2018-09-20 08:55:31

标签: c pointers

#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个索引指针和第一个索引指针内部的地址之间的差为 16个字节

我最初以为是因为我为其分配的字符串是9个字符,所以不超过 8个字节,它不适合 8个字节块,因此扩展为 16个字节。因此,要检查这一点,我指出了第5个索引和第6个索引中的短字符串,但是如您所见,它们之间的地址仍然存在16字节的差异。

因为我有一个 64位系统,所以地址5和6指针之间的区别不应该是 8字节吗?

2 个答案:

答案 0 :(得分:12)

myarr[0]指向"1st array"

的第一个元素

myarr[1]指向"2nd array"

的第一个元素

它们可能不能相距8个字节。

但是请放心&myarr[1] - &myarr[0]将是sizeof(char*)

请注意,您的打印地址之间的距离不是16个字节:例如,第一组地址的第5个十六进制有效数字不同。

答案 1 :(得分:2)

编译器可以将文本存储在内存中的任何位置。因此无法指定输出之间的差距。

  

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