结构体指针转换为数组地址

3

将字符数组的地址赋值给结构体指针是否可行?

  typedef struct {
  int ID;
  word32 Myports;
  stripports gd[256] ;
  }Table;

  typedef struct {
  oldxmd used;
  newip  ip;
  newxmd new;
  }stripports;

  char buffer1[256];

  Table *tableptr = buffer1 ;

  tableptr ->ID = 15 ;
  tableptr ->Myports= somenumber ;
  tableptr ->gd[0].used = somenumber ;

困难的部分是我无法解释为什么 tableptr 会接受一个数组起始地址!我的最佳猜测是上面的代码不正确或不安全。

尽管后来采用了强制转换,但为什么它能够接受一个数组呢?

 Table* tableptr = (Table*)buffer1;

Table *tableptr = buffer1 ; 被许多测试中的 Table* tableptr = (Table*)buffer1; 替代。

不进行强制类型转换,struct 指针可以取除了新创建的指向 struct 的地址以外的其他值吗?

我在存储库中有一系列测试,由许多作者撰写,真的很混乱。


我相信这是安全的,但是尝试直接修改缓冲区,然后将其作为结构体读回来会产生未定义的行为。 - Antimony
1
没有采取任何措施确保缓冲区正确对齐以用作“表”,因此这段代码似乎不安全。 - Mankarse
1
而且 Table 比缓冲区大,这似乎很危险。 - jv42
2个回答

1

将字符数组的地址分配给结构体指针并不保证能够正常工作,可能存在对齐问题。有些架构只允许将 int 对齐到偶数地址,而字符数组通常可以从任何地址开始。

还存在缓冲区溢出问题。如果 Table 类型比字符数组大,可能会覆盖其他变量或导致内存保护错误。

这两个问题都可以通过改变来克服。

char buffer1[256];

char *buffer1 = (char*)malloc(sizeof Table);

由于这个问题被标记为“C”,请使用#include <stdlib.h>并且不要强制转换为char*。 - Jens

0

不,这不行。

演员阵容

Table* tableptr = (Table*)buffer1; 

只是告诉编译器“闭嘴,干活!”它并不能神奇地使其工作,只是让编译器不再抱怨。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接