问个C语言结构体中的结构体指针问题,求大家回答。

我简单些例子了,这个我没编译过,就是特意问问,因为我之前写的例子复杂,不太好给大家看。typedefstruct{charUserName[1024];}Check_t;... 我简单些例子了,这个我没编译过,就是特意问问,因为我之前写的例子复杂,不太好给大家看。

typedef struct
{
char UserName[1024];
}Check_t;
typedef struct
{
Check_t *Check;
}AL_t;
/*01*/
int main(void)
{
AL_t al;
strcpy(al->Check->UserName,"MyName");
printf(al->Check->UserName);
return 0;
}
/*02*/
int main(void)
{
AL_t al;
Check_t ck;
al.Check=&ck;
strcpy(al.Check->UserName,"MyName");
printf(al.Check->UserName);
return 0;
}

我们看到这里有两个结构体,是一个结构体内部套着另一个结构体的指针,
所以我现在想对子结构体内部的UserName装入字符串,并打印出来,我就是干这个事情。

第一个主函数运行会导致非法内存的访问,而第二个主函数则正确打印了字符串,请问是不是由于第一个main中虽然我AL_t al;但是我却没有对al.Check的指针赋值,也就是形式上al.Check指向子结构体,但是我并没有对他赋值,也没有定义这个结构体,所造成的。

如果是这样的话,我面临着一个程序方面的另一个问题
void UpdateData(AL_t *p)
{
.../*内部是关于AL_t结构体的子结构体的操作*/
}
如果我打算写一个上面这种的子函数,那么我在执行这个子函数之前,就不但得定义AL_t 的结构体,还要定义Check_t的结构体,而且我还要将AL_t内Check指向Check_t定义的结构体,这样我这个子函数才能正确执行。
这样做的话,是否是正确做法,因为我感觉这样操作结构体,发现在子函数调用前,我提前需要进行的操作比较多。
所以,还望个位学者,从平时操作和使用上,给点意见。
展开
 我来答
█╬卍╬█
2013-02-21 · TA获得超过162个赞
知道小有建树答主
回答量:115
采纳率:0%
帮助的人:167万
展开全部
你的第一个main函数:
strcpy(al->Check->UserName,"MyName");
这个访问方式不对,应该是:
strcpy(al.Check->UserName,"MyName");
当然,这不是主要的问题,主要问题正如你所说,没有为al.Check分配内存空间,也就是al.Check的值是乱码,al.Check所指向的内存空间你是无权操作的,所以会导致非法内存的访问。

理了一下你的思路,你的意思是说希望能定义一个AL_t的结构体变量之后到使用UpdateData函数操作它之前,你还需要做太多的操作,希望简化这些操作?是吧?

方案一:


typedef struct
{
Check_t *Check;
}AL_t;
改为
typedef struct
{
Check_t Check;//直接定义成值类型

}AL_t;

方案二:
参照面向对象的方式:构造->使用->析构
#include<stdlib.c>//记得包含头文件

写一个初始化函数:
init_AL_t(AL_t* t)
{
t->Check=(Check_t*)malloc(sizeof(Check_t));

}
删除函数
destroy_AL_t(AL_t* t)
{
free(t->Check);

}
这种方式不太推荐,因为使用完后一定要free,不然会内存泄露,改变Check时也要free,否则同样会有内存泄露的问题。
北京羿射旭科技有限公司
2019-11-29 广告
高阻尼隔震橡胶支座的价格大概在每个一两百元,便宜的有十几二十元,贵的有好几百元。高阻尼隔震橡胶支座的价格受多方面影响,如品牌、类别、规格、市场等。关键还是要学会挑选方法。变检算是否满足相应地震力作用下的使用要求。b..应根据跨度和温度变化幅... 点击进入详情页
本回答由北京羿射旭科技有限公司提供
匿名用户
2013-02-21
展开全部
如果你能精简下你的问题,重新组织下文字,就容易找到你的问题并回答了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式