请教c指针在reinterpret_cast上的应用

如下代码:通过reinterpret_cast转换成了U8*, 但是为什么u8[0].buf输出的是"abcdefgh123456"而不是"abcdefgh"呢?

难道和字符串\0有关吗?但是U8类型是声明的一个struct的,reinterpret_cast强转为U8*后,应该每次读取一个U8结构体单位啊。

typedef struct {
    char buf[8];
} U8;

int main(){
    char bufaa[16] = "abcdefgh123456";
    U8* u8 = reinterpret_cast<U8*>(bufaa); 
    printf("=====1. %s\n", u8[0].buf); //输出:abcdefgh123456
    printf("=====2. %s\n", u8[1].buf); //输出:123456
    return 0;
}
阅读 1.7k
2 个回答

printf %s 打印的是以'\0'为结束的字符串。

你的字符串直到 '6' 后面才有一个 '\0',所以一定会打印到 '6' 才结束。

printf 并不知道你的数组被声明为多长了,因为数组在被作为参数传递的时候,已经被转换为了一个指针,失去了长度信息。

你误解了 reinterpret_cast 会造成的影响,它不改变指针所指对象的任何内容,是“视作”的意思。

单独看这两句的理解过程,

u8[0] => *(u8 + 0) => *(U8*)(((char*)u8) + sizeof(U8) * 0)
u8[1] => *(u8 + 1) => *(U8*)(((char*)u8) + sizeof(U8) * 1)

那么需要注意的是,代码并不是看到 * 就一定在这里解引用,继续看

u8[1].buf => (u8 + 1)->buf

那么这里就仍然没有对 u8 的任何位置写了新值。

此外基本地,对于数组,有

buf => &buf[0]

就符合两处 printf 的结果了。


极端地讲,char buf[8]; 也不蕴含着一定是 \0 结尾之意,所以没有断掉输出也是自然的事情。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题