const char*到int强制转换

const char* to int cast?

本文关键字:转换 int char const      更新时间:2023-10-16

我想下面这个片段的行为应该是未定义的,但我只是想确保我理解得正确。假设我们有这样的代码:

#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个字符的