老虎的菜 发表于 2022-5-18 10:48:05

关于结构体内存连续问题?

定义一个结构体 struct student{int num1,int num2,int num3}stu;struct stu Stu;for(i=0;i<3;i++){printf(“num:%d\n”,*(&Stu.name1 + sizeof(int)* i);)}这么用可以吗?会依次打印num1,num2,num3吗? struct里的元素类型是相同类型,因为需要不同命名不能用数组。

eric2013 发表于 2022-5-19 06:38:13

int的话,MDK为例会都是4字节对齐。

庄永 发表于 2022-5-19 23:34:20

首先,结构体写错了,第二你直接用*是个错误,编译器不知道你接下来是按int读取还是其他大小读取,第三直接取值和一个数值相加很多能被隐形类型转换,不安全甚至是错误。改为*(int *)((uint32_t)&Stu.num1 + sizeof(int) * i)。另外直接将Stu强转成int *更方便

cowen 发表于 2022-5-27 12:27:55

结构体内部都是同一种数据类型是可以这样操作,但这样阅读不好
我一般是用联合体,联合体内有结构体和数组
union student
{
    struct
    {
      int number1;
      int number2;
      int number3;
    };
   
    uint8_t bytes;
    uint32_t words;
}stu;

emwin 发表于 2022-6-9 14:54:38

本帖最后由 emwin 于 2022-6-9 14:55 编辑

要点在这行,其他错误编译器会提示你:
printf("num:%d\n",*(&Stu.num1 + i));

老虎的菜 发表于 2022-10-21 11:30:08

emwin 发表于 2022-6-9 14:54
要点在这行,其他错误编译器会提示你:
printf("num:%d\n",*(&Stu.num1 + i));

还是你理解我想说的重点,我想问一下这么用会有什么隐患吗?

Edmund1964 发表于 2022-10-24 17:22:20

不指定指针类型应该会报错, 或最起码会警告, 巨体这要看那家的编译

312456990 发表于 2022-10-26 08:26:17

老师好! 想请教一下, 我做Modbus从机, 对主机写入的值做 限制(Min ~ Max)目前我是初始化结构体时, 直接写好最大值 和 最小值 再比对写入值, 有没有啥好的思路
页: [1]
查看完整版本: 关于结构体内存连续问题?