const char*到int强制转换
const char* to int cast?
我想下面这个片段的行为应该是未定义的,但我只是想确保我理解得正确。假设我们有这样的代码:
#include <iostream>
int main()
{
std::cout << "mamut" - 8 << std::endl;
return 0;
}
所以我认为这是(char*)((int)(const char*)-(int)),尽管之后的输出很奇怪,但我并不认为它有任何实际意义。所以我的问题是关于char*和int之间的转换——它是未定义的,还是背后有一些逻辑?
编辑:让我补充一下:
#include <iostream>
int main ()
{
const char* a = "mamut";
int b = int(a);
std::cout << b << std::endl;
std::cout << &a <<std::endl;
// seems b!= &a
for( int i = 0; i<100;i++)
{
std::cout<<(const char*)((int)a - i)<<std::endl;
}
return 0;
}
在我变得足够大之后的输出会给我一个类似_Jv_RegisterClasses等的东西。仅供记录:
std::cout << a - i << std::endl;
产生与相同的结果
std::cout<<(const char*)((int)a - i)<<std::endl;
没有强制转换,您只是告诉cout您想在字符串文字"mamut"减去8字节的地址打印字符串。你在做指针运算。cout随后会打印出发生在该地址的任何内容,或者可能会崩溃&burn,因为越界访问数组会导致未定义的行为。
编辑
关于操作的编辑:将地址转换为int
并不一定会产生与地址相同的正确数字。地址不一定适合int
,除此之外,int
是一个签名类型,将地址存储在签名类型中没有任何意义。
为了保证从指针到整数的转换不会丢失,您需要使用stdint.h中的uintptr_t
。
引用C标准6.3.2.3(我认为C++在这种情况下是相同的):
任何指针类型都可以转换为整数类型。除了前面指定的,结果是实现定义的。如果结果不能用整数类型表示,行为为未定义。结果不必在任何整数类型。
没有强制转换。"mamut"
是一个指向字符的指针,- 8
会对它进行指针运算。你说得对,这是一个未定义的行为,所以即使语义行为是指针运算,运行时行为也可以是任何东西。
您正在打印从"mamut"地址开始减去8个字节直到空终止符的字符串,即总共8+5 = 13
个字符的
相关文章:
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 是否可以从int转换为enum类类型
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 功能样式转换从 'int' 到 'ItemType' 的匹配转换
- 将 int 数组转换为 std::vector<int*>
- 如何转换 int 变量并附加到常量 wchar_t*
- 类型转换<int>的舍入问题
- 在Objective-C中调用sqlite3数据库时,如何调用和转换int/NSNumber
- 转换 int -> 无符号长 长 是否由标准定义
- 简单的 int 到字符串转换..int to const char* 无效
- 如何将转换 int 除法键入为浮点数
- C++类型转换 int * 到类
- 预期的类型说明符,并且无法在初始化时转换“int*”
- 转换int并将其与char*连接
- 字符串流在转换int型时添加新行
- 转换int为字符串/char c++ /Arduino
- c# P-Invoke:如何转换INT fun(BYTE *bStream, UINT16 *nCount, const
- 类型转换(int**)和int(*)的区别
- 从"int"到"nodeType"的无效转换<int>
- 从无符号int构造对强制转换int的引用