指针语法查询

时间:2012-01-27 20:14:11

标签: c pointers struct

我似乎无法理解以下指针符号之间的区别,有人可以指导我吗?

 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; 

就我而言,我认为这两种实现都应该产生相同的结果,有人可以指导我两者之间是否存在差异,如果有,可以指出它吗?

感谢。

3 个答案:

答案 0 :(得分:3)

在您的第一个代码段中,this不是指针,它是some_struct的实例。您所做的任务对buf中的内容进行了浅层复制(即memcpy()),就好像它也是some_struct的实例一样。

在第二个代码段中,this是一个指针,它只是指向buf的地址。

所以,基本上总结一下,第一个片段this不是指针,结构被复制到其中。在第二个中,它是一个指针并分配给与buf相同的内存(即不是副本)。

答案 1 :(得分:0)

在第二个中,“this”将指向“buf”的第一个内存位置。在第一个示例中,您将获得编译器错误(我不认为您可以在C中使用=分配结构,但我可能是错的),或者将复制buf(最大为sizeof(struct_name))的内容进入这个,它位于堆栈中。

答案 2 :(得分:0)

这两种方法都存在问题。

  • alignment:您的buf可能未针对结构类型的变量正确对齐。如果是这样,这将产生未定义的行为(UB):在最好的情况下,它会中止你的程序,但它可能会比这更糟糕。
  • 初始化:在第一种情况下,您可以访问未初始化的内存以进行读取。在给出非特定数据的最佳情况下,这是一些随机字节。在最坏的情况下,char是您平台上的有符号整数类型,并且您点击了char =>的陷阱表示。 UB如上。 (一旦您尝试访问指针另一端的对象,您的第二种情况将遇到同样的问题。)

如何避免这一切:

  • 始终初始化您的变量。在所有情况下都应该使用简单的= { 0 }
  • 从不使用char作为字节的泛型类型,而是使用unsigned char
  • 永远不会将任意对齐的字节缓冲区转换为其他数据类型。如果需要,请反过来将struct对象强制转换为unsigned char