首页 > 解决方案 > 为什么两个指针之间有 16 个字节的差异而不是 8 个字节?

问题描述

#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 位系统,地址第 5 和第 6 指针之间的差异不应该是8 个字节吗?

标签: cpointers

解决方案


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

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

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

但请放心,&myarr[1] - &myarr[0]会的sizeof(char*)

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


推荐阅读