我似乎无法理解以下指针符号之间的区别,有人可以指导我吗?
typedef struct some_struct struct_name;
struct_name this;
char buf[50];
this = *((some_struct *)(buf));
现在我试着玩一下,做了以上的事情:
struct some_struct * this;
char buf[50];
this=(struct some_struct *)buf;
就我而言,我认为这两种实现都应该产生相同的结果,有人可以指导我两者之间是否存在差异,如果有,可以指出它吗?
感谢。
答案 0 :(得分:3)
在您的第一个代码段中,this
不是指针,它是some_struct
的实例。您所做的任务对buf中的内容进行了浅层复制(即memcpy()
),就好像它也是some_struct
的实例一样。
在第二个代码段中,this
是一个指针,它只是指向buf
的地址。
所以,基本上总结一下,第一个片段this
不是指针,结构被复制到其中。在第二个中,它是一个指针并分配给与buf
相同的内存(即不是副本)。
答案 1 :(得分:0)
在第二个中,“this”将指向“buf”的第一个内存位置。在第一个示例中,您将获得编译器错误(我不认为您可以在C中使用=分配结构,但我可能是错的),或者将复制buf(最大为sizeof(struct_name))的内容进入这个,它位于堆栈中。
答案 2 :(得分:0)
这两种方法都存在问题。
buf
可能未针对结构类型的变量正确对齐。如果是这样,这将产生未定义的行为(UB):在最好的情况下,它会中止你的程序,但它可能会比这更糟糕。char
是您平台上的有符号整数类型,并且您点击了char
=>的陷阱表示。 UB如上。 (一旦您尝试访问指针另一端的对象,您的第二种情况将遇到同样的问题。)如何避免这一切:
= { 0 }
。char
作为字节的泛型类型,而是使用unsigned char
struct
对象强制转换为unsigned char
。