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;