1

我需要帮助解决我遇到的编译错误。

错误是:错误:从不同大小的整数转换为指针 [-Werror=int-to-pointer-cast]

在下一行

PRINT_INDENT("Inode2 PTR: %p\n", (void *)ptr);

语境

unsigned int ptr;
memcpy(&ptr, value, sizeof(ptr));
PRINT_INDENT("Inode2 PTR: %p\n", (void *)ptr);

#define PRINT_INDENT(...) ({int __j = indent_level; while (__j-- > 0) printf("  "); printf(__VA_ARGS__);})
4

3 回答 3

2

你用的是32位的64位平台int吗?如果是这样,错误是不言自明的。ptr是一个 32 位变量,您将其转换为 64 位void *. 一种解决方法是首先将其转换为unsigned long longa 然后将结果转换为 a void *

PRINT_INDENT("Inode2 PTR: %p\n", (void *)(unsigned long long)ptr);

但是你为什么要这样做?为什么不直接打印ptr为 aunsigned int而不是将其转换为 avoid *如下:

PRINT_INDENT("Inode2 PTR: %u\n", ptr);
于 2012-10-25T03:48:00.030 回答
1

我不确定为什么需要将 int 转换为指针;如果目的只是打印指针,则可能没有必要。

但是,如果需要这种类型的转换,那么为了确保整数具有正确的大小,C++11 为无符号整数数据类型提供了一个别名,该数据类型足够大以容纳指针:

std::uintptr_t

它在cstdint标题中定义(对于 C,C99 标准也定义了它uintptr_tstdint.h

使用它作为你的整数类型(或将现有的整数类型转换为这个 - 但请注意,如果原始类型更大,可能会丢失信息!)如果确实需要 int/pointer casts,则这是正确的方法。

请参阅相关问题:什么是 uintptr_t 数据类型

于 2012-10-25T03:51:46.447 回答
0

uintptr_t如果你想做这种事情,你应该使用类型。它是 C99 和 C++11 标准中相对较新的类型。

不能保证整数足够大以保存指针值,实际上在具有 32 位整数和 64 位指针的 64 位平台上它们不是。

memcpy(&ptr, value, sizeof(ptr));

如果value是指针,该行将仅复制其 64 位值的一半。

于 2012-10-25T03:47:45.853 回答