Printf指针以十进制表示法

时间:2016-09-24 08:14:27

标签: c pointers printf

如何以十进制表示法打印指针?

使用-Wall进行编译时,以下任何一项都不会产生所需的结果。我理解错误,并希望使用-Wall进行编译。但是,如何以十进制表示法打印指针?

#include <stdio.h>
#include <stdlib.h>

int main() {
    int* ptr = malloc(sizeof(int));
    printf("%p\n", ptr);                 // Hexadecimal notation
    printf("%u\n", ptr);                 // -Wformat: %u expects unsigned int, has int *
    printf("%u\n", (unsigned int) ptr);  // -Wpointer-to-int-cast
    return EXIT_SUCCESS;
}

(这是必需的,因为我在点图中使用指针作为节点标识符,而0x..不是有效的标识符。)

2 个答案:

答案 0 :(得分:7)

C有一个名为uintptr_t的数据类型,它足以容纳指针。一种解决方案是将指针转换(转换)为(uintptr_t)并打印出来,如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>

int main(void) 
{
    int* ptr = malloc(sizeof *ptr);
    printf("%p\n", (void *)ptr);                 // Hexadecimal notation
    printf("%" PRIuPTR "\n", (uintptr_t)ptr);
    return EXIT_SUCCESS;
}

请注意,%p需要一个void *指针,如果用-pedantic编译代码,gcc会发出警告。

string format for intptr_t and uintptr_t似乎也很相关。

答案 1 :(得分:1)

有一份报告说“有些&#39;平台不在其PRI*PTR文件中提供inttypes.h个宏。如果是您的情况,请尝试使用printf("%ju\n", (uintmax_t)ptr);

...虽然我认为你应该拥有这些宏,因为你看起来正在使用GNU C.