我读到数据桶值存储在连续的内存位置。我试图在我的64 bit mac
上打印字符数组的内存位置
char str1[] = "Hell";
printf("%p:%lu:%c, %p:%lu:%c, %p:%lu:%c, %p:%lu:%c", str1[0], str1[0], str1[0], str1[1], str1[1], str1[1], str1[2], str1[2], str1[2], str1[3], str1[3], str1[3]);
我得到的结果是
0x48:72:H, 0x65:101:e, 0x7fff0000006c:140733193388140:l, 0x7fff0000006c:108:l
考虑到char
的大小为1 byte
,这看起来不像是连续的内存地址。如果我弄错了,请帮助我理解。
答案 0 :(得分:2)
printf
声明中的参数不正确。
如果您打算以十进制打印地址,请写下以下内容:
char str1[] = "Hell";
printf("%p:%lu:%c, %p:%lu:%c, %p:%lu:%c, %p:%lu:%c\n",
(void*)&str1[0], (unsigned long)&str1[0], str1[0],
(void*)&str1[1], (unsigned long)&str1[1], str1[1],
(void*)&str1[2], (unsigned long)&str1[2], str1[2],
(void*)&str1[3], (unsigned long)&str1[3], str1[3]);
但请注意,将指针转换为unsigned long
可能会丢失信息,因为unsigned long
的大小可能小于char*
的大小(在Windows 64位上);
如果您想输出十进制和字符的字符,格式应为%d
,代码更改为:
char str1[] = "Hell";
printf("%p:%d:%c, %p:%d:%c, %p:%d:%c, %p:%d:%c\n",
(void*)&str1[0], str1[0], str1[0],
(void*)&str1[1], str1[1], str1[1],
(void*)&str1[2], str1[2], str1[2],
(void*)&str1[3], str1[3], str1[3]);