问一个动态结构指针的问题,急!!
slackm
问一个动态结构指针的问题,急!!
因为用到的结构体是动态生成,所以无法直接访问结构成员。在结构变量名已知,结构成员类型,和结构成员长度已知的情况下,有什么办法可以访问每个结构成员?
如下一个结构体
typedef struct
{
成员1 char[10];
成员2 long;
成员3 int;
} test_struct;
test_struct example_struct;
有什么办法可以访问example_struct里的每个成员?
net_robber
example_struct.成员1
example_struct.成员2
example_struct.成员2
cobras
[code]
typedef struct
{
成员1 char[10];
成员2 long;
成员3 int;
} test_struct;
[/code]
这是什么语法? C ?
slackm
先谢谢回复的朋友。。。。
我可能没说清楚意思-_-
我举的例子里的结构体有3个成员,这3个成员名未知,只知道他们的类型和长度。
我想问的就是有什么办法能访问这3个成员。
yecheng_110
typedef struct
{
char a[10];
long b;
int c;
} my_struct;
自己这样定义一下
slackm
这个结构因为不是我定义的,所以不知道结构的成员名。
结构成员的类型和长度以及在结构中定义的顺序可以从配置文件中得到,而且结构体的指针也可已从参数中得到。
但是因为不知道结构成员名,因此无法通过 . 操作符和 ->操作符来访问。
是否可以通过指针的偏移量来访问数据成员?
204tian
知道对齐方式的话, 就可以通过指针的偏移量来访问了
westmylove
[quote]原帖由 [i]slackm[/i] 于 2008-6-27 14:06 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8685984&ptid=1182009][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
这个结构因为不是我定义的,所以不知道结构的成员名。
[color=Magenta]结构成员的类型和长度以及在结构中定义的顺序可以从配置文件中得到[/color],而且结构体的指针也可已从参数中得到。
但是因为不知道结构成员名,因此无法通过 ... [/quote]
知道结构体的排列顺序了,应该可以计算出来偏移量吧。
只不过要算好long / int / char 之间的对齐了。。。
主要是跟顺序有关吧。
nbaloverme
既然你知道结构各成员的类型和顺序
那就自己定义一个数据结构,根据指针作内存拷贝不就可以访问了吗
net_robber
没关系,你只要定义一个结构相同的 struct,然后做指针类型转换,之后直接用就行
204tian
[quote]原帖由 [i]net_robber[/i] 于 2008-6-27 14:47 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8686437&ptid=1182009][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
没关系,你只要定义一个结构相同的 struct,然后做指针类型转换,之后直接用就行 [/quote]
不错:mrgreen:
slackm
[quote]原帖由 [i]net_robber[/i] 于 2008-6-27 14:47 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8686437&ptid=1182009][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
没关系,你只要定义一个结构相同的 struct,然后做指针类型转换,之后直接用就行 [/quote]
在函数里动态定义一个结构吗?
我现在要做的就是一个公函,结构变量指针通过参数传进来,机构成员类型和长度可以通过解析配置文件得到,然后在函数里实现对结构成员的访问。
由于结构是根据配置文件动态生成,因此不可能事先定义一个结构相同的 struct
yecheng_110
[quote]原帖由 [i]slackm[/i] 于 2008-6-27 15:36 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8686942&ptid=1182009][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
在函数里动态定义一个结构吗?
我现在要做的就是一个公函,结构变量指针通过参数传进来,机构成员类型和长度可以通过解析配置文件得到,然后在函数里实现对结构成员的访问。
由于结构是根据配置文件 ... [/quote]
说你原始的需要
slackm
[quote]原帖由 [i]yecheng_110[/i] 于 2008-6-27 15:42 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8686998&ptid=1182009][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
说你原始的需要 [/quote]
就是不通过 . 和 -> 操作符来访问结构成员,而是通过指针的偏移来访问结构成员。
我做了一点点尝试,但是好像还有问题。
我定义了一个结构
typedef struct {
char buff1[5];
char buff2[5];
int x;
double y;
long z;
} ttt;
然后试图通过指针偏移来访问成员
main()
{
char a[10];
char b[10];
ttt test_struct;
void *temp;
strcpy(test_struct.buff1, "Hi!");
strcpy(test_struct.buff2, "Bye!");
temp = &test_struct;
printf("test_struct.buff1=[%.5s]/n", (char *)temp);
printf("test_struct.buff2=[%.5s]/n", (char *)temp + 5);
memcpy(a, (char *)temp, 5);
memcpy(b, (char *)temp + 5, 5);
printf("a=[%s]/n", a);
printf("b=[%s]/n", b);
}
运行后显示的结果为:
test_struct.buff1=[Hi!]
test_struct.buff2=[Bye!]
a=[Hi!]
b=[Hi!]
从显示结果看,test_struct.buff1和test_struct.buff2访问正常,test_struct.buff1中的内容复制到了a,但是test_struct.buff2的内容并没有复制到b。
不知道错在哪里了。。
gothicane
不知道类型的话,很难推断出成员间的偏移吧,对齐不同,成员间可能会被填充pad
yecheng_110
[quote]原帖由 [i]slackm[/i] 于 2008-6-27 16:11 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8687282&ptid=1182009][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
就是不通过 . 和 -> 操作符来访问结构成员,而是通过指针的偏移来访问结构成员。
我做了一点点尝试,但是好像还有问题。
我定义了一个结构
typedef struct {
char buff1[5];
char b ... [/quote]
为什么要这样做的?
没有别的办法吗
结构体各个数据成员的位置你知道编译器是怎么安排的吗?
slackm
[quote]原帖由 [i]gothicane[/i] 于 2008-6-27 16:16 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8687327&ptid=1182009][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
不知道类型的话,很难推断出成员间的偏移吧,对齐不同,成员间可能会被填充pad [/quote]
成员类型和长度知道的
yecheng_110
[quote]原帖由 [i]slackm[/i] 于 2008-6-27 16:34 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8687548&ptid=1182009][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
成员类型和长度知道的 [/quote]
LZ就是不说自己想干什么:mrgreen:
slackm
[quote]原帖由 [i]yecheng_110[/i] 于 2008-6-27 16:39 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8687598&ptid=1182009][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
LZ就是不说自己想干什么:mrgreen: [/quote]
前面我不是说过了吗:wink:
[quote]原帖由 [i]slackm[/i] 于 2008-6-27 15:36 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8686942&ptid=1182009][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
....
我现在要做的就是一个公函,结构变量指针通过参数传进来,机构成员类型和长度可以通过解析配置文件得到,然后在函数里实现对结构成员的访问。
由于结构是根据配置文件动态生成,因此不可能事先定义一个结构相同的 struct [/quote]