#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个十六进制有效数字上有所不同.