#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字节吗?
答案 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