结构体内的成员增加是否会带来问题?

qjipa 2011-02-15 05:23:25
标题说得不是太清楚,其实是这样的...

例如我在c编程时定义了一个结构体

typedef struct _AA AA;

struct _AA
{
int a;
int b;
int c;
};

而且定义了一个函数,作为我写的dll的一个导出函数,可以被我的主程序exe调用

int func(AA* aa);

但由于程序升级扩展的关系,结构体AA的成员多了,但dll的代码没有更新

typedef struct _AA AA;

struct _AA
{
int a;
int b;
int c;
int d;
int e;
};


现在程序调用dll中的func函数,依然是传了一个结构体的指针,那么dll在访问AA中的成员a、b、c,仍然可以保证能访问到a、b、c的值吗?不会错误地访问到d、e?或者内存越界?也许是我想多了吗?谢谢了
...全文
220 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xwfde 2011-02-15
  • 打赏
  • 举报
回复
首先linux中不存在dll ,只有window 采用。其次增加成员确实会出错,出错情况乃是这样,你更新了dll,但是应用程序没有重新编译过,那么用旧的应用程序调用新的dll 就会出错,你若在dll中增加了变量或函数数目那绝对会出错,你若不增加数目,只是改变函数实现方式,修改函数内部代码则不会出错。因为新增的变量会改变原来的地址。除非你把新增的东西放到dll 最后。
qjipa 2011-02-15
  • 打赏
  • 举报
回复
其实最主要的原因是我很多时候无法更新dll,旧的dll由于代码本身就没有也不需要对d,e进行操作,新的程序会检测dll版本并自己适配,新dll返回新结果,旧dll返回旧结果,主要是想做到对老代码的兼容,而不至于出现严重错误而已

关键是这样的传指针方式ansi c标准是否认可呢?因为我的程序是需要跨平台编译的,会不会同样的代码在windows下vc编译运行没问题,在linux下gcc编译运行会出错?我刚才发贴没有说到...
Rain208 2011-02-15
  • 打赏
  • 举报
回复
如果没有提示版本不一致的话, 应该是不会报错,但是你还是用旧的dll分配空间
那就是说你新的结构体还是分配了a b c 三个变量

d e 都不存在
昵称很不好取 2011-02-15
  • 打赏
  • 举报
回复
应该更新你的dll文件
moorsf 2011-02-15
  • 打赏
  • 举报
回复
你举例的情况是可以的,也就是保持原成员相对结构首地址的偏移不变,
但也只限于指定地址的指针操作。

如果有类似p++这种指针操作,由于dll中编译时用的旧的结构大小,所以会出问题。

byktwc 2011-02-15
  • 打赏
  • 举报
回复
a,b,c应该都能访问吧,但是在分配内存时,应该只分配了a,b,c的大小吧,要是访问d,e就应该出错了
bdmh 2011-02-15
  • 打赏
  • 举报
回复
那要看你怎么写的dll,不过建议你还是同时更新dll。你这么干,太不负责任了

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧