结构体中同一成员变量两种定义的用法

ewolfe163 2017-04-28 08:51:41
1. 头文件

tst.h
struct funarg_s
{
uchar fun;
char funNm[10+1];
#ifdef _XX_YY_
char rtn[4];
#else
long rtn
#endif
};

2. lib中的函数原型
fun.c

#define _XX_YY_ 1 //有宏定义
void op(struct funarg_s *fa)
{
long lrtn;
....
//fa->rtn = lrtn; //有时会返回异常
memcpy(&fa->rtn, &lrtn, sizeof(int));
}

3. 调用程序
tst.c //没有_XX_YY_宏定义

#include "tst.h"
main()
{
struct funarg_s funarg;

op(&funarg);
}

问题:
op中有不同功能。
如果是“fh->rtn=lrtn", 在op函数里打印正常,但到main中却是异常(数值没超过最大值)
若使用memcpy(&fa->rtn, &lrtn, sizeof(int))则目前还没有发现问题

如果结构体中的#ifdef ..., 直接只定义long rtn, 在op()中只保留fh->rtn = lrtn也同样存在函数内打印正常,到main中就异常的情况。

是什么原因呢?
...全文
245 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
幻夢之葉 2017-04-28
  • 打赏
  • 举报
回复
引用 2 楼 jianwen0529 的回复:

void op(struct funarg_s *fa)
{
#ifdef _XX_YY_
    long   lrtn;
    //...
#else
    char lrtn;
    //...
#endif // _XX_YY_

    fa->rtn = lrtn;                                             //有时会返回异常
    //memcpy(&fa->rtn, &lrtn, sizeof(fa->rtn));
}
错了,char那里应该是个数组

void op(struct funarg_s *fa)
{
#ifdef _XX_YY_
    long   lrtn;
    //...
    fa->rtn = lrtn;                                             //有时会返回异常

#else
    char crtn[4];
    //...
    memcpy(&fa->rtn, &crtn, sizeof(char)*4);
#endif // _XX_YY_
}
幻夢之葉 2017-04-28
  • 打赏
  • 举报
回复

void op(struct funarg_s *fa)
{
#ifdef _XX_YY_
    long   lrtn;
    //...
#else
    char lrtn;
    //...
#endif // _XX_YY_

    fa->rtn = lrtn;                                             //有时会返回异常
    //memcpy(&fa->rtn, &lrtn, sizeof(fa->rtn));
}
赵4老师 2017-04-28
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
#define field_offset(s,f) (int)(&(((struct s *)(0))->f))
struct AD  { int a; char b[13]; double c;};
#pragma pack(push)
#pragma pack(1)
struct A1  { int a; char b[13]; double c;};
#pragma pack(2)
struct A2  { int a; char b[13]; double c;};
#pragma pack(4)
struct A4  { int a; char b[13]; double c;};
#pragma pack(8)
struct A8  { int a; char b[13]; double c;};
#pragma pack(16)
struct A16 { int a; char b[13]; double c;};
#pragma pack(pop)
int main() {
    printf("AD.a %d\n",field_offset(AD,a));
    printf("AD.b %d\n",field_offset(AD,b));
    printf("AD.c %d\n",field_offset(AD,c));
    printf("AD sizeof %d\n", sizeof(AD));
    printf("\n");
    printf("A1.a %d\n",field_offset(A1,a));
    printf("A1.b %d\n",field_offset(A1,b));
    printf("A1.c %d\n",field_offset(A1,c));
    printf("A1 sizeof %d\n", sizeof(A1));
    printf("\n");
    printf("A2.a %d\n",field_offset(A2,a));
    printf("A2.b %d\n",field_offset(A2,b));
    printf("A2.c %d\n",field_offset(A2,c));
    printf("A2 sizeof %d\n", sizeof(A2));
    printf("\n");
    printf("A4.a %d\n",field_offset(A4,a));
    printf("A4.b %d\n",field_offset(A4,b));
    printf("A4.c %d\n",field_offset(A4,c));
    printf("A4 sizeof %d\n", sizeof(A4));
    printf("\n");
    printf("A8.a %d\n",field_offset(A8,a));
    printf("A8.b %d\n",field_offset(A8,b));
    printf("A8.c %d\n",field_offset(A8,c));
    printf("A8 sizeof %d\n", sizeof(A8));
    printf("\n");
    printf("A16.a %d\n",field_offset(A16,a));
    printf("A16.b %d\n",field_offset(A16,b));
    printf("A16.c %d\n",field_offset(A16,c));
    printf("A16 sizeof %d\n", sizeof(A16));
    printf("\n");
    return 0;
}
//AD.a 0
//AD.b 4
//AD.c 24
//AD sizeof 32
//
//A1.a 0
//A1.b 4
//A1.c 17
//A1 sizeof 25
//
//A2.a 0
//A2.b 4
//A2.c 18
//A2 sizeof 26
//
//A4.a 0
//A4.b 4
//A4.c 20
//A4 sizeof 28
//
//A8.a 0
//A8.b 4
//A8.c 24
//A8 sizeof 32
//
//A16.a 0
//A16.b 4
//A16.c 24
//A16 sizeof 32
//
//

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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