c语言结构体赋值问题。

sweird 2013-09-12 06:40:52
以下代码中 ctx->blobs[0] = blob; 结构体blog的值无法正确赋值给ctx->blobs[0]。
结构体作为函数参数时传值的,那应该没有任何问题。更奇怪的是我在asn1_init函数里加了那条printf,就可以神奇的变好。
高手能看出什么问题吗?

void asn1_init(asn1_ctx_t * ctx, chunk_t blob, u_int level0, int implicit, u_int cond)
{
//printf("in fuc:%s, blob->len:%d\n", __func__, blob.len);
ctx->blobs[0] = blob;
ctx->level0 = level0;
ctx->implicit = implicit;
ctx->cond = cond;
memset(ctx->loopAddr, '\0', sizeof(ctx->loopAddr));
}
struct chunk {
unsigned char *ptr;
unsigned int len;
};

typedef struct chunk chunk_t;

#define ASN1_MAX_LEVEL 10


typedef struct {
int implicit;
u_int cond;
u_int level0;
u_int loopAddr[ASN1_MAX_LEVEL + 1];
chunk_t blobs[ASN1_MAX_LEVEL + 2];
} asn1_ctx_t;
...全文
350 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
sweird 2013-09-18
  • 打赏
  • 举报
回复
引用 9 楼 u011779875 的回复:
结构体有指针 赋值要小心 原因 指针存的是地址 地址指向的值 指针赋错 不知道指向哪去了 第二结构体 赋值的时候会有内存对齐 等对齐方式 因为它们的存放是顺序的 但是编辑器或者CPU是不准你浪费的 这样就会产生不必要的和你想的可能不一样 这个多反汇编看看 自己弄懂才算真的懂
1,关键在于它没有正确赋值,如果正确赋值,那么指针指向的地方是正确的。 2,关键是我这个结构体成员已经4字节对齐了啊。
sweird 2013-09-18
  • 打赏
  • 举报
回复
引用 11 楼 lm_whales 的回复:
你的类型定义顺序是对的吗? 你给出的代码显然是不对的!
您的意思是要按此结构内的成员顺序赋值? typedef struct { int implicit; u_int cond; u_int level0; u_int loopAddr[ASN1_MAX_LEVEL + 1]; chunk_t blobs[ASN1_MAX_LEVEL + 2]; } asn1_ctx_t;
lm_whales 2013-09-18
  • 打赏
  • 举报
回复
我的意思,是类型先定义,后使用。 类型定义,放在前面。 不知,你那种写法,是代码就是那个样子,还是表示,类型已经定义,定义的形式是那个样子! 如果是代码就是,那个样子,那就是一种错误,要改过来。 否则,需要编译调试以下,看通过一否,调试信息,运行结果等等! 函数声明,可以放在类型定义前面,如果类型由前向声明的话。 否则,函数 定义里面,使用的类型,必须是已经定义的。 类型定义内部的,成员函数的定义的时候,可以视为该类型本身,已经定义; 其他时候,类型定义要在,函数定义之前。

struct chunk {
        unsigned char *ptr;
        unsigned int  len;
};

typedef struct chunk chunk_t;

#define ASN1_MAX_LEVEL  10


typedef struct {
        int implicit;
        u_int cond;
        u_int level0;
        u_int loopAddr[ASN1_MAX_LEVEL + 1];
        chunk_t blobs[ASN1_MAX_LEVEL + 2];
} asn1_ctx_t;

void asn1_init(asn1_ctx_t * ctx, chunk_t blob, u_int level0, int implicit, u_int cond)
{
//printf("in fuc:%s, blob->len:%d\n", __func__, blob.len);
        ctx->blobs[0] = blob;
        ctx->level0 = level0;
        ctx->implicit = implicit;
        ctx->cond = cond;
        memset(ctx->loopAddr, '\0', sizeof(ctx->loopAddr));
}
结构体整体复制,对于C语言,原来是个问题,不可以整体复制; 后来就不算问题了,允许整体复制了。 (至少VC6的C,C++是可以的) 现在,不论C,C++ 结构体整体复制,都没有问题。 PS: 结构体可以直接赋值,不过那个指针,如果是动态分配的就会出问题( 有两个地方持有那个指针,该在那里释放) 如果是局部自动变量的地址, 那么就必须,在这个局部变量,的生命周期结束前,使用,超过就会出错。 换句话说,这个结构体,含有一个指针,如何初始化,和应该深拷贝,还是浅拷贝,这个必须考虑好,处理 好,不然就会出问题。 如果,你的程序,是多线程,加了printf变好,就一点也不奇怪了。
lm_whales 2013-09-15
  • 打赏
  • 举报
回复
你的类型定义顺序是对的吗? 你给出的代码显然是不对的!
nice_cxf 2013-09-13
  • 打赏
  • 举报
回复
结构里面有指针,赋值或拷贝的时候都要小心再小心
lin5161678 2013-09-13
  • 打赏
  • 举报
回复
赋值没什么问题 这个的问题 估计是 struct chunk { unsigned char *ptr; //这个参数 有没有指向有效的对象?? unsigned int len; };
赵4老师 2013-09-13
  • 打赏
  • 举报
回复
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
zhao 2013-09-13
  • 打赏
  • 举报
回复
结构体直接赋值在C和C++里面都是支持的,但是如果里面有指针最好不要这样做!
做或不做 2013-09-13
  • 打赏
  • 举报
回复
结构体有指针 赋值要小心

原因 指针存的是地址 地址指向的值 指针赋错 不知道指向哪去了
第二结构体 赋值的时候会有内存对齐 等对齐方式 因为它们的存放是顺序的 但是编辑器或者CPU是不准你浪费的
这样就会产生不必要的和你想的可能不一样 这个多反汇编看看 自己弄懂才算真的懂
sweird 2013-09-13
  • 打赏
  • 举报
回复
引用 6 楼 nice_cxf 的回复:
结构里面有指针,赋值或拷贝的时候都要小心再小心
为什么呢?谢谢。
sweird 2013-09-13
  • 打赏
  • 举报
回复
引用 5 楼 lin5161678 的回复:
赋值没什么问题 这个的问题 估计是 struct chunk { unsigned char *ptr; //这个参数 有没有指向有效的对象?? unsigned int len; };
指向的是有效对象。
AnYidan 2013-09-12
  • 打赏
  • 举报
回复
结构体可以赋值,没有问题 但结构体嵌套了,没见这么用过,可能有域的问题,换个环境试试
图灵狗 2013-09-12
  • 打赏
  • 举报
回复
blob是结构体,也应该一个一个属性赋值。
引用 楼主 rosetta 的回复:
以下代码中 ctx->blobs[0] = blob; 结构体blog的值无法正确赋值给ctx->blobs[0]。 结构体作为函数参数时传值的,那应该没有任何问题。更奇怪的是我在asn1_init函数里加了那条printf,就可以神奇的变好。 高手能看出什么问题吗?
void asn1_init(asn1_ctx_t * ctx, chunk_t blob, u_int level0, int implicit, u_int cond)
{
//printf("in fuc:%s, blob->len:%d\n", __func__, blob.len);
        ctx->blobs[0] = blob;
        ctx->level0 = level0;
        ctx->implicit = implicit;
        ctx->cond = cond;
        memset(ctx->loopAddr, '\0', sizeof(ctx->loopAddr));
}
struct chunk {
        unsigned char *ptr;
        unsigned int  len;
};

typedef struct chunk chunk_t;

#define ASN1_MAX_LEVEL  10


typedef struct {
        int implicit;
        u_int cond;
        u_int level0;
        u_int loopAddr[ASN1_MAX_LEVEL + 1];
        chunk_t blobs[ASN1_MAX_LEVEL + 2];
} asn1_ctx_t;
max_min_ 2013-09-12
  • 打赏
  • 举报
回复
对于结构体体赋值,直接等? 重载了么? 为什么不用memcpy呢?

69,371

社区成员

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

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