【发布时间】:2020-12-22 20:06:29
【问题描述】:
考虑以下 sn-p,对于 C 和 C++ 语言,是:
int t[2] = { 0, 1 };
*( (int *)( (char *)t + sizeof(int) ) ) = 2;
总是等价于:
int t[2] = { 0, 1 };
t[1] = 2;
?
这听起来可能很奇怪,但我想出了一些在某些平台上可能是错误的原因:
-
char指针增量可能与int指针相反,除非它未经标准授权(在这种情况下,我想找到标准规定的位置) -
从
int *到char *的转换可能是不安全的,因为不能保证它们的大小相同(在这种情况下,它可以与void *的中间转换一起使用吗?),并且因为标准不保证先转换为char *然后再转换为指向任何类型的指针是安全的
【问题讨论】:
-
C 和 C++ 是不同的语言。值得注意的是,C++ 对指针算术和对象生存期有更严格的规则,因此两种语言的答案可能会有所不同。您应该指定您实际询问的语言。
-
@FlashMcQueen 是的。如果不允许这样做,那不是因为不同类型的数组在不同的方向上增长。
-
请选择一种语言。这个问题很有趣,但如果同时包含两种语言,就会变得有点宽泛
-
@FlashMcQueen “在这种情况下,我很想学习这两种语言”可能是真的,但现在你需要一个需要 2 种语言的主题。这样,您就更有可能获得 OK 2 种语言的答案,而不是 1 种 专家 级别的答案。如果第一个问题不满足,最好发布第二个问题。
-
你不能实现
memcpy、malloc等,如果指针算术根据类型走向不同的方向,那么它们都可以使用空指针。
标签: c++ arrays c pointers pointer-arithmetic