指针算术编译失败,gcc指出类型转换无效

Pointer arithmatic failed to compile, gcc says invalid type conversion

本文关键字:类型转换 无效 gcc 编译 失败 指针      更新时间:2023-10-16

我想计算程序的bss部分和堆开始部分之间的距离,所以我有一个这样的程序:

$ cat 1.cpp

#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
int empty;//bss
int main()
{
  char*p=(char*)malloc(0);
  printf("%dn",(int)p-(int)&empty);
  return 0;
}

当我使用

编译代码时
$ g++ 1.cpp

错误如下:

1.cpp: In function ‘int main()’:
1.cpp:8:22: error: cast from ‘char*’ to ‘int’ loses precision [-fpermissive]
   printf("%dn",(int)p-(int)&empty);
                  ^
1.cpp:8:30: error: cast from ‘int*’ to ‘int’ loses precision [-fpermissive]
   printf("%dn",(int)p-(int)&empty);
                          ^

我不认为将int*转化为int是不合适的。我在网上找到了很多这样做的例子。

为什么我的代码不编译?

不要总是相信你在网上看到的东西。

假设您在一个指针是64位而int是32位的平台上。在这种情况下,从指针到int的转换会失去精度,并且您正在使用正确的标志进行编译,从而导致错误。做得好!

要将指针转换为整型的类型是uintptr_t。这是由标准定义为有足够的宽度,以允许无损转换。

您可能需要p-reinterpret_cast<char*>(&empty)

但是我不认为有任何理由计算两个地址之间的距离。(和@mch所指出的未定义行为)

转换为from指针的类型应该是uintptr_t,这样可以保证不丢失精度,参见固定宽度整数类型。

如果你坚持使用printf,那么你需要找到正确的格式化器,因为这不是固定的。否则,使用:

std::cout << reinterpret_cast<uintptr_t>(p);