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

App*_*lik 2 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*/
}
Run Code Online (Sandbox Code Playgroud)

当我在上面的代码中打印它们的值时,我评论了地址.存储在第0个和第1个索引指针内的地址之间的差异是16个字节.

我首先想到的是,因为我分配它们的字符串是9个字符,所以超过8个字节,它不适合8字节块,所以它扩展到16个字节.所以为了检查这一点,我指出了第5和第6个索引中的短字符串,但正如您所看到的那样,它们之间的地址仍然有16个字节的差异.

由于我有一个64位系统,地址第5和第6指针之间的差异应该是8字节吗?

Bat*_*eba 12

myarr[0] 指向第一个元素 "1st array"

myarr[1] 指向第一个元素 "2nd array"

它们不可能相隔8个字节.

不过放心,&myarr[1] - &myarr[0]sizeof(char*).

请注意,您的打印地址不是相隔16个字节:例如,第一个集合在第5个十六进制有效数字上有所不同.