此行中是否有任何类型的强制转换(隐式,显式):
int *p= "hello there";
此外,从C / C ++的角度来看,这种陈述的正确性是什么?
注意:它在AVR-GCC上编译,但在其他编译器中失败。
答案 0 :(得分:6)
"此行中是否有任何类型的投射(隐式,显式):"
int *p= "hello there";
不,没有完成任何演员。
但是在C ++中,您可以使用reinterpret_cast<int*>
和const_cast<char*>
,如下所示:
int *p= reinterpret_cast<int*>(const_cast<char*>("hello there"));
<子> See a working demo. 子>
&#34;此外,您如何从(C,C ++)的角度思考这种陈述的正确性。&#34;
嗯,完全留给用户这样的陈述。这样做肯定不值得推荐(因为你没有指定 1 行为),如果你不是100%肯定你的&#39,那就很危险做的。
但至少两种语言都支持这样做。
C的一个较短的变体是:
int *p= (int*)"hello there";
&#34;注意:它在AVR-GCC上编译,但在其他编译器中失败。&#34;
好吧,我不知道您为AVR交叉工具链使用的版本,但任何中途版本的GCC都应该为此声明提供错误,例如
prog.cpp:3: error: cannot convert 'const char*' to 'int*' in initialization
<子> See demo please 子>
我使用相当旧版本的GCC来构建该演示:g ++ 4.3.2。如果我已正确通知,最新版本为5.x,并且我非常确定AVR可以to build a cross toolchain使用它。
1 与未定义的行为略有不同。这取决于您的硬件与这些指针地址以及对齐设置的匹配程度。
答案 1 :(得分:1)
回答你的问题(忽略&#39;为什么这样做?评论 - 这是正确的)
你做
int *p=(int*)"hello there";
答案 2 :(得分:1)
此代码在C和C ++中是非法的。我们可能会猜到AVR-GCC假装你写了:
int *p = (int *)"hello there";
您可以尝试通过写下来确认:
char *q = "hello there";
int *p = q;
并查看p
和q
是否拥有相同的地址。 (尽管这两种方式都不会完全确定)。
最好找出如何在一种模式下调用编译器,在这种模式下,它会报告非法代码的错误或警告。通常对于gcc,-Wall -pedantic
执行此操作,通常您还会指定标准版本,例如-std=c99
或-std=gnu99
。
假设代码被视为int *p = (int *)"hello there";
。此代码可能会导致未定义或意外的行为,因为char数组可能未正确对齐int
。
此外,如果您因违反严格别名规则而读取或写入p
,则会导致未定义的行为,该规则表示只允许将int
读取或写入声明为{{int
的变量。 1}},或malloc&#39; d空间(如果被阅读)已经写了int
。