先上段代碼:
#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的時候,一直有問題。
請問下,要怎么修改!
感激不盡了。(做一個課題,就卡在這個地方了)
11 个解决方案
將
*q=e;
改為
q->id = e.id;
q->name = (char *)malloc(21);
strcpy(q->name,e.name);
將
*q=e;
改為
q->id = e.id;
q->name = (char *)malloc(21);
strcpy(q->name,e.name);
瀏覽器出問題了,不小心恢復了2次。
你的程序的問題在於
*q=e的時候,對於char*成員是將指針賦值,注意到temp的name指向的是input()函數里面的局部變量ch,所以你的
Sqlist a的元素也指向了這個局部變量,但是當調用結束后該值就無效了。
所以你應該給你的elem的name開辟出適當的空間,並將內容拷貝進去。
你可以根據ch最大為21字節,也可以通過strlen(e.name)+1,通過用戶輸入的具體長度來開辟空間。
2次malloc意思是說,
typedef struct
{
int id;
char *name;//因為這里還是個指針所以,對於每個元素都仍然要malloc一次。所以這里你可以改為char name[21];一個數組。到時候
//直接拷貝內容到字符數組,就可以減少一次malloc
}elem;
typedef struct
{
elem *EE;//這里是個結構體指針,你一次malloc了10個元素。
int length;
}Sqlist;
建議樓主看一下goodname的回復,寫的很好,還補充了解釋。