指针算术编译失败,gcc指出类型转换无效
Pointer arithmatic failed to compile, gcc says invalid type conversion
我想计算程序的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);
相关文章:
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++无效的函数类型转换
- Zedboard zynq-7000 Opencl 浮点数从类型 'double*' 强制转换为类型 'double' 无效
- 从类型"void*"到函数指针的强制转换无效
- 从类型"void*"到类member_function指针的强制转换无效
- 另一个:从"常量类型*"到"类型*"的转换无效
- 将前向声明的类型转换为无效是否合法?
- 相同类型之间的转换无效
- 移动语义:从"类型&&"到"类型"的转换无效。模板:将未知参数传递给重载函数
- C++从类型“void*”转换为类型“double”无效
- 类型转换无效指针指向无符号短整型
- 视窗 - FMX - 无效的类类型转换C++
- Tcl_CreateCommand的类型转换无效
- 从类型 'MyStruct' 转换为类型 'void*' 无效
- 从“char*”到“char”[-fpermissive]的转换无效,数组下标的类型“char[int]”无效
- 从类型"浮点数"到类型"浮点数*"的转换无效
- 指针算术编译失败,gcc指出类型转换无效
- 使用虚函数协变返回类型的c++无效转换错误
- 使用 static_cast 进行无效的类型转换,我应该使用什么正确的转换