问题描述

由于海思芯片紧缺,公司决定启用一款新的音视频处理芯片,我负责要将原有的算法库移植到新平台。在移植的过程中,发现调用某个图像转换函数时,得不到正确的结果,而且这个函数还是其他的库里实现的,我只是调用。于是我去查看了这个函数的实现,传参主要是通过一个结构体。我在调用这个函数前,将该结构体的成员变量的值都打印出来,发现没有问题,然后在被调用的函数里,打印接收到的变量的值,发现对不上。这就很奇怪了,明明我在调用函数前赋值都是正确的,为什么传进去就不对了,百思不得其解。简单来说,就是我在A库调用B库实现的函数时,发现通过结构体传参,传过去的变量的值不正确。

解决步骤:

1.传参是传的结构体指针,我在调用函数前打印了这个结构体指针,在被调用函数里也打印了这个结构体指针,发现指针是一样的,表明传参是没有问题的。这里存在两种出错的可能,一种是两者数据解析方式不同,毕竟传的是同一内存地址,数据都一样;还有一种可能是该内存地址处的数据被意向不到的地方给修改了,导致两次去读取该内存的数据不一样。
2.接着进一步添加打印,我把结构体里的每个成员变量的地址都打印出来,发现在调用前打印和在被调用函数里打印是不一样的,这就能解释为什么传参的值不正确了,因为两次读取的都不是同一内存地址处的数据。这让我想起来结构体的对齐,毕竟面试时候考结构体最喜欢考对齐,于是我用sizeof()函数在两个库都打印了该结构体占用的字节数,果然两个库里同一结构体占用的字节数不一样,由此推断是两个库的对齐字节数不同导致的。
3.两个库都是运行在同一芯片,默认的对齐字节数就是CPU的位宽,32位机器就是4byte,64位芯片就是8byte。肯定有地方强行修改了对齐字节数,于是我用比对软件对比两个库里同一头文件的差异,发现其中一个库用了#pragma pack(4)将对齐字节数强行修改成4字节,这才导致两个库里结构体不一样。不熟悉的可以参考博客《嵌入式开发——#pragma pack()常见用法介绍》。
4.因为海思芯片是32位的,默认就是4byte对齐,所以加不加#pragma pack(4)都是4字节对齐,代码在海思芯片上运行就没有问题。现在移植到的新芯片是64位的,默认是8字节对齐,这样就导致A库是8字节对齐,B库是4字节对齐,导致结构体大小不同,成员变量的地址相对于结构体首地址的偏移量也不同,肯定不能解析出正确的数据。

总结

我遇到的这种情况,最根本的原因就是两个库的交互头文件不一致导致的,正常情况两个库里的同一头文件应该是相同的。这是个历史遗留问题,以前被掩盖了,现在移植新平台才显露出来。同时也提醒自己,修改库之间交互的头文件要慎重。

嵌入式开发——结构体指针作为参数传递变量的值不正确相关推荐

  1. C语言结构体指针与结构体变量作形参的区别

    区别 结构体变量 结构体变量作为函数参数,传递的是结构体变量本身,是一种值传递 形参结构体变量成员值的改变不影响对应的实参构体变量成员值的改变 结构体指针 结构体指针作为函数参数,传递的是指向结构体变 ...

  2. 结构体指针和结构体变量

    文章目录 1.前言 2.内存空间上面的差别 3.访问上的差别 1.前言 今天在写题目的时候出现了一处小错误,就是由于结构体指针和结构体变量没有区分清楚,接下来谈一谈这两者的区别: 2.内存空间上面的差 ...

  3. 结构体变量与结构体指针的区别

    A.对于结构体变量(即代码中Lnode类型),本身作为一个变量,就像是int a中的a变量,本身是具有内存空间的,该内存空间是用于存放该结构体成员的数值的.因此区别于结构体指针,结构体变量是不需要ne ...

  4. 我在微信上大学:如何正确理解指针和结构体指针?

    一直觉得C语言较其他语言最伟大的地方就是C语言中的指针,有些人认为指针很简单,而有些人认为指针很难,当然这里的对简单和难并不是等价于对指针的理解程度. 为此在这里对C语言中的指针进行全面的总结,从底层 ...

  5. Go语言自学系列 | golang结构体指针

    视频来源:B站<golang入门到项目实战 [2021最新Go语言教程,没有废话,纯干货!持续更新中...]> 一边学习一边整理老师的课程内容及试验笔记,并与大家分享,侵权即删,谢谢支持! ...

  6. 【C 语言】结构体 ( 结构体作为函数参数 | 结构体指针作为函数参数 )

    文章目录 一.结构体作为函数参数 二.结构体指针作为函数参数 三.完整代码示例 一.结构体作为函数参数 结构体变量 作为函数形参 , 在函数中 , 只能访问 该函数形参 , 无法修改 结构体内存 的值 ...

  7. C语言结构体与结构体指针的使用

    C语言结构体与结构体指针的使用 tips:最近要好好学习一下数据结构,所以必不可少的就是c语言的结构体和结构体指针了,所以就整理一下这些基础知识 c语言结构体(struct)是由一系列具有相同类型或不 ...

  8. C代码开发遇到的问题 变量初始化和结构体指针移动

    1. 变量初始化 函数内部的变量如果不初始化的话默认不是0而是一个随机值. 下面的程序用来打印一个未初始化的无符号的整型值,执行几遍,每次的结果都会不一样 #include <stdio.h&g ...

  9. C语言定义了一个结构体怎么分配内存?C\C++中结构体变量与结构体指针内存分配问题?

    C语言定义了一个结构体怎么分配内存?C\C++中结构体变量与结构体指针内存分配问题? 问题1:结构体指针最开始怎么分配内存?用sizeof()是不能确定大小的. 问题2:给结构体变量分配之后,是否还要 ...

最新文章

  1. 尹伊:Datawhale做的一件事
  2. 《CLR Via C# 第3版》笔记之(十) - 可选参数和可变数量参数
  3. 拦截导弹 最长上升/下降子序列
  4. kafka安装(版本kafka_2.11-0.11.0.0)
  5. Fiddler 从安装到使用 (creation of the root certificate wasn)
  6. .NET环境下每日集成(4):CruiseControl.Net配置注意事项
  7. opencv及相机相关6
  8. OpenFlow和SDN的历史和原理介绍
  9. java .net 3des_Java.net3DES差异及互通
  10. 写出好代码系列 工程思维
  11. 子类重载父类函数_Python面向对象之继承、重写与重载
  12. Linux内核project导论——网络:Netfilter概览
  13. JAVA菜鸟入门(8) Java的Final关键字
  14. 传智黑马python18期_传智博客黑马Python就业14期资料
  15. 预处理criteo数据集以预测广告的点击率
  16. centos解压分卷rar_linux命令:tar分卷压缩与合并解压缩
  17. DLL劫持技术解析(DLL Hijack)
  18. 抓包基础概述,以及为什么抓包
  19. [PyTorch]手动实现logistic回归(只借助Tensor和Numpy相关的库)
  20. 均值定理最大值最小值公式_数学均值定理怎么求不等式的最大值最小值,求教会(ฅω*ฅ)...

热门文章

  1. 动态活体检测 | 算法分析
  2. Unity UI跟随鼠标移动
  3. 一键中文数据增强包 ; NLP数据增强、bert数据增强、EDA:pip install nlpcda
  4. 《大学》《中庸》全文及翻译 (转载)
  5. url的转换与重定向
  6. win10下RTX 2080ti安装cuda10.0和cudnn7.6.5
  7. GNN-Retro 逆合成路线规划
  8. SQLyog数据库导出数据 避免科学记数法
  9. 2017百度世界大会 | 爱奇艺创始人CEO龚宇演讲速记
  10. Macbook Pro 外接显卡实现Tensorflow GPU运行之内屏输出