结构体里面char型指针赋值的问题

cengkis 2009-06-15 08:54:58
先上段代码:

#include<stdio.h>
#include<stdlib.h>

typedef struct
{
int id;
char *name;
}elem;

typedef struct
{
elem *EE;
int length;
}Sqlist;

Sqlist a;

int InitList_Sq(Sqlist *L) //构造
{
L->EE=(elem *)malloc(10*sizeof(elem));
L->length = 0;
return 1;
}

int ListInsert_Sq(Sqlist *L, elem e) //末端插入
{
elem *q;
q = &(L->EE[L->length]);
*q=e;
++L->length;
return 1;
}

void input()
{
elem temp;
char ch[21];
// temp=(elem *)malloc(sizeof(elem));
printf("请输入id\n");
scanf("%d",&temp.id);
printf("请输入name\n");
scanf("%s",ch);
temp.name=ch;
ListInsert_Sq(&a,temp);


}
void main()
{
InitList_Sq(&a);

input( );

printf("%d,%s",a.EE->id,a.EE->name);
}





我的意图是:
Sqlist a;
然后初始化a————InitList_Sq(&a);
接着,往a里面插入一个elem型结构体。
于是,有了:input( ); 这个函数。
这个时候,问题就来了。

input( );函数里面,
只能正确输出a.EE->id
但是,a.EE->name的值,要么就是输出乱码,要么就是直接程序崩溃。

调了好久一直找不到错误在哪里。
后来,在论坛找了下相关的,得出的结论是:没有给temp分配空间。

因为没有开辟一个elem型的temp的空间。
所以,赋值会出问题。
那么我就malloc一个咯。
这个时候,又出问题了。
但是,我用malloc的时候,一直有问题。
请问下,要怎么修改!
感激不尽了。(做一个课题,就卡在这个地方了)
...全文
1309 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
pengzhixi 2009-06-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 cengkis 的回复:]
引用 5 楼 hairetz 的回复:


typedef struct
{
int id;
char name[5];
}elem;

省事

嗯,没错,这种方式是省事,但是,如果我要把一个
char[21]="abcd"
赋值给elem.name
这个时候,就要一个一个赋值。有点麻烦。所以,我选用了*
[/Quote]
你用指针一样的麻烦,首先你要为指针分配内存,而且你还必须用strcpy拷贝进去.否则,你将另外一个指针赋给他时,就会导致name和另外的一个指针指向同一个对象.你就很难保证其他地方是否对这个对象做修改或者销毁.

pysjp 2009-06-15
  • 打赏
  • 举报
回复
建议楼主看一下goodname的回复,写的很好,还补充了解释。
cengkis 2009-06-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hairetz 的回复:]


typedef struct
{
int id;
char name[5];
}elem;

省事
[/Quote]

嗯,没错,这种方式是省事,但是,如果我要把一个
char[21]="abcd"
赋值给elem.name
这个时候,就要一个一个赋值。有点麻烦。所以,我选用了*
goodname 2009-06-15
  • 打赏
  • 举报
回复
2次malloc意思是说,
typedef struct
{
int id;
char *name;//因为这里还是个指针所以,对于每个元素都仍然要malloc一次。所以这里你可以改为char name[21];一个数组。到时候
//直接拷贝内容到字符数组,就可以减少一次malloc
}elem;

typedef struct
{
elem *EE;//这里是个结构体指针,你一次malloc了10个元素。
int length;
}Sqlist;
cengkis 2009-06-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hairetz 的回复:]
typedef struct
{
int id;
char *name; //再一次看到这种结构,既然你自己选择的就必须2次malloc,一次malloc elem,一次q->name=(char*)malloc(5);
}elem;

[/Quote]

嗯,按理说,是要malloc elem ,
但是,按照goodname的回复,直接在ListInsert_Sq函数里面,改写。就可以了。我运行也没有错误。
这也没有malloc elem。

按照goodname的说法,也就是:temp.name指向了局部变量ch,然后在ListInsert_Sq函数里面,修改下,开辟个空间,这样就行了。
也就可以少malloc一次了。

是不是这样?
别逗我乐 2009-06-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 goodname 的回复:]

*q=e;
改为
q->id = e.id;
q->name = (char *)malloc(21);
strcpy(q->name,e.name);
[/Quote]

正解!帮顶!
  • 打赏
  • 举报
回复
typedef struct
{
int id;
char *name; //再一次看到这种结构,既然你自己选择的就必须2次malloc,一次malloc elem,一次q->name=(char*)malloc(5);
}elem;


或者改成

typedef struct
{
int id;
char name[5];
}elem;

省事



goodname 2009-06-15
  • 打赏
  • 举报
回复
浏览器出问题了,不小心恢复了2次。

你的程序的问题在于
*q=e的时候,对于char*成员是将指针赋值,注意到temp的name指向的是input()函数里面的局部变量ch,所以你的
Sqlist a的元素也指向了这个局部变量,但是当调用结束后该值就无效了。
所以你应该给你的elem的name开辟出适当的空间,并将内容拷贝进去。
你可以根据ch最大为21字节,也可以通过strlen(e.name)+1,通过用户输入的具体长度来开辟空间。
pengzhixi 2009-06-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 goodname 的回复:]

*q=e;
改为
q->id = e.id;
q->name = (char *)malloc(21);
strcpy(q->name,e.name);
[/Quote]

因为你的char *name没分配内存的,所以出问题
goodname 2009-06-15
  • 打赏
  • 举报
回复

*q=e;
改为
q->id = e.id;
q->name = (char *)malloc(21);
strcpy(q->name,e.name);
goodname 2009-06-15
  • 打赏
  • 举报
回复

*q=e;
改为
q->id = e.id;
q->name = (char *)malloc(21);
strcpy(q->name,e.name);

69,382

社区成员

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

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