当前位置: 代码迷 >> C语言 >> [求助]有关结构体的问题
  详细解决方案

[求助]有关结构体的问题

热度:245   发布时间:2007-08-06 15:55:53.0
d=(struct data*)malloc(sizeof(struct data));
d->ps=b=(struct setting*)malloc(sizeof(struct setting)*n);????这相当于给ps分配了n个setting连续的空间

scanf("%ld",&(*d).time);???scanf("%ld",&(d->time));
scanf("%d",&((*d).ps)->money);???scanf("%d",&(d->ps->money));这好看点吧!!


(d->ps)->next=(struct setting*)malloc(sizeof(struct setting)*n);给setting的next也分配n个空间??

d->ps=(struct setting*)malloc(sizeof(struct setting)*n);已经分配了,还要再分配??


总之你的程序让人费解!!!






----------------解决方案--------------------------------------------------------
以下是引用maoguoqing在2007-8-5 23:16:39的发言:

不少最后一项,是任何一项都可以,
还有,不能说是什么可变的,只是一个指针,该指针本身的大小是固定的,只是它指向哪里,指向多大的内存区域,是不确定的。

你说的不对,
你的意思是建立链表,但是我说的是结构体的可变数组,那和链表不一样,
一定要声明定义在结构体的最后一项


----------------解决方案--------------------------------------------------------
以下是引用jackys2006在2007-8-6 20:11:55的发言:

你说的不对,
你的意思是建立链表,但是我说的是结构体的可变数组,那和链表不一样,
一定要声明定义在结构体的最后一项

那个只是运用了连续分配内存的技巧,现在很多已经不支持了,即便编译不会错,但是结果往往不是所要的。


----------------解决方案--------------------------------------------------------
回复:(viky2003) d=(struct data*)malloc(sizeof(s...

明白了,我已经会了。谢谢诸位的指点!


----------------解决方案--------------------------------------------------------

既然是结构体 那么结构体的结构就是一样的
也就是说长度是一样的 结构体中的成员是一样的
就我现在知道的来说
结构体是不可变的
如果 有错误还请高手指教 谢谢!


----------------解决方案--------------------------------------------------------
不好意思 理解错楼主的题意了呵呵建立链表就可以的了
每个结构体后加一个指针域 就可以了
好像有人解答过了 5555555
----------------解决方案--------------------------------------------------------
以下是引用sjt在2007-8-6 11:49:48的发言:

你好,这是我按照你说的编的程序,可是怎么输出的时候只有前两个数据是正确的?
#define NULL 0
struct data
{long time;
struct setting *ps;
struct data *next;
};
struct setting
{int money;
float sum;
struct setting *next;
};
main()
{int n,a;
char s;
struct data *d;struct setting *b;
printf("Please input the totol number \n");
scanf("%d",&n);
d=(struct data*)malloc(sizeof(struct data));
d->ps=b=(struct setting*)malloc(sizeof(struct setting)*n);

printf("please tell me wen you bought this jijin\n");
scanf("%ld",&(*d).time);
for(a=1;a<=n;a++)
{
printf("money\n");
scanf("%d",&((*d).ps)->money);
printf("sum\n");
scanf("%d",&((*d).ps)->sum);
if(a!=n)
{
(d->ps)->next=(struct setting*)malloc(sizeof(struct setting)*n);
d->ps=(struct setting*)malloc(sizeof(struct setting)*n);

}
else
d->ps->next=NULL;
}
d->next=NULL;
getch();
d->ps=b;
printf("%ld\n",(*d).time);
do
{
printf("%d\n",((*d).ps)->money);
printf("%d\n",((*d).ps)->sum);
d->ps=(d->ps)->next;
getch();
}while(d->ps!=NULL);
getch();
}

个人觉得把红色部分的代码改成以下的代码可能会好点。

//多定义了temp和last指针。last指针的值为d->ps所指链表的最后一项setting结构体的地址。
struct data *d;struct setting *b ,*temp,*last;
........

b=(struct setting*)malloc(sizeof(struct setting));
d->ps=b;
last=b;
........

temp=(struct setting*)malloc(sizeof(struct setting));
temp->next=null;                  
last->next=temp;
last=temp;    //使last指针始终指向链表的最后一项。






----------------解决方案--------------------------------------------------------
回复:(zhss5)以下是引用sjt在2007-8-6 11:49:48的发...

我已经做好了,思路和你给我的提示差不多.呵呵,还是谢谢你啊!!!!!


----------------解决方案--------------------------------------------------------
以下是引用maoguoqing在2007-8-6 20:50:09的发言:

那个只是运用了连续分配内存的技巧,现在很多已经不支持了,即便编译不会错,但是结果往往不是所要的。

我不知道连续分配内存是什么意思,我回去看了书,那个叫做结构体的伸缩型数组成员。楼主本来的意思也应该是这样的,后来采用了链表。当然两者都是解决问题的方法。也就是在那个结构体里存放不定数量的另外一个结构体数组。至于支持不支持,听你的口气好象那个是很老的东西,其实那是C99最新才出来的,如果你的编译环境不支持,那只能说明你的编译环境不够先进。
以下是Stephen Prata先生在<<C Primer Plus>>中的原文节选,供大家学习参考:
伸缩型数组成员是C99的新特性之一。利用这一新特性可以声明最后一个成员是一个具有特殊属性的数组的结构。该数组成员的特殊属性之一是它不存在,至少不立即存在。第二个特殊属性是您可以编写适当的代码使用这个伸缩型数组成员,就像它确实存在并且拥有您需要的任何数目的元素一样。可能这听起来有些奇怪,因此让我们开始一步一步地创建和使用具有伸缩型数组成员的结构。
首先,看看声明一个伸缩型数组成员的规则:
1.伸缩型数组成员必须是最后一个数组成员。
2.结构中必须至少有一个其他成员。
3.伸缩型数组就像普通数组一样被声明,除了它的方括号内是空的。
下面是一个说明这些规则的例子:
struct flex
{
int count;
double average;
double scores[];
};
现在已经声明了一个struct flex类型的变量,但是您不能使用scores做任何事情,因为没有位它分配任何内存空间。实际上,C99的意图并不是让您声明struct flex类型的变量;而是希望您声明一个指向struct flex类型的指针,然后使用malloc()来分配足够的空间,以存放struct flex结构的常规内容和伸缩型数组成员需要的任何额外的空间。例如,假设想要用scores表示含有5个double型数值的数组,那么就要这样做:
struct flex *pf;
pf=malloc(sizeof(struct flex)+5*sizeof(double));
现在您已经有足够大的一块内存,以存储count、average和一个含有5个都不了型数值的数组。可以使用指针pf来访问这些成员。
pf->count=5; //设置count成员的值
pf->scores[2]=18.5; //设置一个数组成员的值


----------------解决方案--------------------------------------------------------
回复:(jackys2006)以下是引用maoguoqing在2007-8-6...

非常感谢!我之前怎么检查都检查不出来错误,但是就是命每次插入一个新的节点的时候,总是显示的是一些乱码...再次感谢!


----------------解决方案--------------------------------------------------------
  相关解决方案