在这一行中是否有任何类型的铸造(隐式、显式):
int *p= "hello there";
此外,从C/C++的角度来看,这种说法的正确性是什么?
注:它在AVR-GCC上编译,并与其他编译器一起失败.
发布于 2015-06-09 15:59:31
回答你的问题(忽略“为什么这么做”的评论-这是正确的)
你做了
int *p=(int*)"hello there";
发布于 2015-06-09 16:30:36
此代码在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
或malloc‘s空间的变量才允许以int
的形式读取或写入已写入int
的int
。
https://stackoverflow.com/questions/30744742
复制相似问题