C ++在char指针中存储char数组

时间:2015-06-09 23:41:02

标签: c++ c

此行中是否有任何类型的强制转换(隐式,显式):

int *p= "hello there"; 

此外,从C / C ++的角度来看,这种陈述的正确性是什么?

注意:它在AVR-GCC上编译,但在其他编译器中失败。

3 个答案:

答案 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;

并查看pq是否拥有相同的地址。 (尽管这两种方式都不会完全确定)。

最好找出如何在一种模式下调用编译器,在这种模式下,它会报告非法代码的错误或警告。通常对于gcc,-Wall -pedantic执行此操作,通常您还会指定标准版本,例如-std=c99-std=gnu99

假设代码被视为int *p = (int *)"hello there";。此代码可能会导致未定义或意外的行为,因为char数组可能未正确对齐int

此外,如果您因违反严格别名规则而读取或写入p,则会导致未定义的行为,该规则表示只允许将int读取或写入声明为{{int的变量。 1}},或malloc&#39; d空间(如果被阅读)已经写了int