为什么打印显示非连续地址的C数组?

时间:2017-07-16 16:46:41

标签: c arrays pointers

我读到数据桶值存储在连续的内存位置。我试图在我的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,这看起来不像是连续的内存地址。如果我弄错了,请帮助我理解。

1 个答案:

答案 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]);