Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ const char*到int cast?_C++_Casting_Char_Int - Fatal编程技术网

C++ const char*到int cast?

C++ const char*到int cast?,c++,casting,char,int,C++,Casting,Char,Int,我想下面代码段的行为应该是未定义的,但我只是想确保我理解正确。 假设我们有以下代码: #include <iostream> int main() { std::cout << "mamut" - 8 << std::endl; return 0; } #包括 int main() { std::cout没有强制转换,您只是告诉cout要在字符串文本“mamut”减去8字节的地址处打印字符串。您正在执行指针算术。cout然后将打印该地址处发生的任何

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

#include <iostream>

int main()
{
  std::cout << "mamut" - 8 << std::endl;
  return 0;
}
#包括
int main()
{

std::cout没有强制转换,您只是告诉cout要在字符串文本“mamut”减去8字节的地址处打印字符串。您正在执行指针算术。cout然后将打印该地址处发生的任何内容,或者可能会崩溃和烧录,因为访问超出边界的数组会导致未定义的行为

编辑

关于op的编辑:将地址转换为
int
不一定会得到与地址相同的正确数字。地址不一定适合
int
并且除此之外,
int
是有符号类型,将地址存储在有符号类型中没有任何意义

为了保证从指针到整数的转换不会丢失,您需要使用stdint.h中的
uintpttr\t

<引用C标准3.3.2.3(我相信C++在本例中是相同的):

任何指针类型都可以转换为整数类型。以下情况除外: 前面指定的结果是实现定义的。如果 无法在整数类型中表示结果,行为为 未定义。结果不必在任何 整数类型


没有强制转换,您只是告诉cout您希望在字符串文本“mamut”减去8字节的地址处打印字符串。您正在执行指针算术。cout然后将打印该地址处发生的任何内容,或者可能会崩溃和烧录,因为访问超出边界的数组会导致未定义的行为

编辑

关于op的编辑:将地址转换为
int
不一定会得到与地址相同的正确数字。地址不一定适合
int
并且除此之外,
int
是有符号类型,将地址存储在有符号类型中没有任何意义

为了保证从指针到整数的转换不会丢失,您需要使用stdint.h中的
uintpttr\t

<引用C标准3.3.2.3(我相信C++在本例中是相同的):

任何指针类型都可以转换为整数类型。以下情况除外: 前面指定的结果是实现定义的。如果 无法在整数类型中表示结果,行为为 未定义。结果不必在任何 整数类型



没有强制转换。
“mamut”
是指向字符的指针,
-8
将对其执行指针运算。您是对的,它是未定义的行为,因此即使语义行为是指针运算,运行时行为也可以是任何形式。

没有强制转换。
“mamut”
是一个指向字符的指针,而
-8
将对其执行指针运算。您是对的,它是未定义的行为,因此即使语义行为是指针运算,运行时行为也可以是任何形式。

您正在打印从“mamut”地址开始的字符串减去8字节直到空终止符,即总共
8+5=13
chars

您正在打印从“mamut”地址开始的字符串减去8字节直到空终止符,即总共
8+5=13
chars

这是未定义的行为,但不是因为你认为的原因。谷歌指针算法。你似乎假设
const char*
在减去
8
时转换为
int
。假设是错误的。为什么假设是错误的?我的意思是你不能添加char*,因为“+”不是为char*+char*”定义的。而且你的编辑与原始问题无关。请在每篇文章中问一个问题,如果你有不同的问题,请写一篇新文章。编辑几乎是同一个程序,但随着i的增大(基本上你会看到除“mamut”-8之外的其他结果).我做了一个for cycle cause,每个I都会打印出我所说的输出。这是未定义的行为,但不是因为你所想的原因。谷歌指针算法。你似乎假设
const char*
在减去
8
时会转换为
int
。假设是错误的。为什么假设是错误的?I意思是你不能添加char*,因为“+”不是为char*+char*”定义的。而且你的编辑与原始问题无关。请在每篇文章中问一个问题,如果你有不同的问题,就写一篇新的文章。编辑几乎是同一个程序,但随着我越来越大(基本上你会看到除“mamut”-8之外的其他结果).我做了一个for循环,因为每个I都会打印出我所说的输出。那么为什么地址与我从(int)(const char*)中得到的数字不一致呢?我不明白你的意思。发布更多的代码来精确说明你的问题。但我试图强调UB的意思是任何事情都可能发生。不需要通过UB解释。从代码中删除UB,然后我们可以进一步深入。那么为什么地址与我从(int)(const char*)中得到的数字不一致?我不明白你的意思。发布更多的代码来精确地说明你的问题。但我试图强调UB的意思是任何事情都可能发生。不需要通过UB来解释。从代码中删除UB,然后我们可以进一步深入。问题是(int)a没有给我a的地址。基本上&a!=(int)a、 从一开始我的问题就是(int)a给了我什么。@lightxbulb我已经在对你的问题的评论中回答了这个问题。为了完整性,我将在这个答案中添加评论。因此,这是未定义的行为和进行转换(int)(const char*)实际上没有逻辑依据?我的意思是演员阵容没有产生任何逻辑结果?@lightxbulb是的
#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;
 }
std::cout << a - i << std::endl;
std::cout<<(const char*)((int)a - i)<<std::endl;