问个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定义的结构体,这样我这个子函数才能正确执行。
这样做的话,是否是正确做法,因为我感觉这样操作结构体,发现在子函数调用前,我提前需要进行的操作比较多。
所以,还望个位学者,从平时操作和使用上,给点意见。 展开
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定义的结构体,这样我这个子函数才能正确执行。
这样做的话,是否是正确做法,因为我感觉这样操作结构体,发现在子函数调用前,我提前需要进行的操作比较多。
所以,还望个位学者,从平时操作和使用上,给点意见。 展开
2个回答
展开全部
你的第一个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,否则同样会有内存泄露的问题。
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 广告
2019-11-29 广告
高阻尼隔震橡胶支座的价格大概在每个一两百元,便宜的有十几二十元,贵的有好几百元。高阻尼隔震橡胶支座的价格受多方面影响,如品牌、类别、规格、市场等。关键还是要学会挑选方法。变检算是否满足相应地震力作用下的使用要求。b..应根据跨度和温度变化幅...
点击进入详情页
本回答由北京羿射旭科技有限公司提供
2013-02-21
展开全部
如果你能精简下你的问题,重新组织下文字,就容易找到你的问题并回答了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询