這個是我嘗試用c語言寫的鏈表,現在寫到了洗掉鏈表中的一個節點的步驟。然后我在這步出現了一個很費解的問題。在void free-node這個方法中,我希望用輔助指標p-freeAid 來輔助我刪掉鏈表中的節點。
下面是我遇到的問題:
① 我已經用P-freeAid指向了 p-free的下一個節點。我在debug里也看到,p-free的下一個節點的地址==p-freeaid的值。
但是我嘗試用 p—freeaid去調p—free的下一個節點的num的值卻顯示系統錯誤,相當費解。
②當我用free釋放了p—free所指的記憶體空間后,我用p-free 讀里面的值仍是有結果的,但是 debug里面顯示的 p free的值是“-179469979(類似與這樣的數)”我感覺這個就證明空間已經釋放了,但是還是能讀到值,這點也超級費解。
代碼貼到下面了,請大神解答一下,感激不禁~
typedef struct student_link
{
char name[20];
int num;
int score;
struct student_link *next;
}STU;
void creat_head(STU **p_head,STU *p_new){
STU *p_mov;
p_mov=*p_head;
if(*p_head==NULL){
*p_head=p_new;
p_new->next=NULL;
}
else {
while ((p_mov->next)!=NULL) {
p_mov=p_mov->next;
}
p_mov->next=p_new;
p_new->next=NULL;
}
}
void showThe_link(STU*p_head){
STU *p_mov;
p_mov=p_head;
if(p_head==NULL){
printf("當前鏈表為空\n");
return;
}else{
while (p_mov!=NULL) {
printf("%d %d %s\n",p_mov->num,p_mov->score,p_mov->name);
p_mov=p_mov->next;
}
}
}
STU* creat_node(int num,int score,char stu_name[]){
STU*p_new;
p_new=(STU*)malloc(sizeof(STU));
strcpy(p_new->name,stu_name);
p_new->num=num;
p_new->score=score;
return p_new;
}
void add_node(STU **p_head,int num,int score,char stu_name[]){
creat_head(p_head,creat_node(num,score,stu_name));
}
void free_node(STU **p_head){
STU*p_free;
STU*p_freeAid;
printf("p_freeAid的值是:0X%x\n",p_freeAid->num);
p_free=*p_head;
if(*p_head==NULL){
printf("這個鏈表為空,無需釋放\n");
}
else{
while (p_free!=NULL) {
p_freeAid=p_free->next;
printf("p_freeAid的值是:0X%x\n",p_free->next->num);
printf("p_freeAid的值是:0X%x\n",p_freeAid);
printf("p_free的值是:0X%x\n",p_free->next);
int num=p_free->num;
printf("%d\n",num);
free(p_free);
printf("%d\n",p_free->num);
p_free=p_freeAid;
}
}
//*p_head=NULL;
}
int main()
{
STU* link_head=NULL;
/* int num,i;
printf("請輸入鏈表初始的個數:\n");
scanf("%d",&num);
for(i=0;i<num;i++){
p_new=(STU*)malloc(sizeof(STU));
printf("請輸入學號、分數、名字:\n");
scanf("%d %d %s",&p_new->num,&p_new->score,&p_new->name);
} */
char str[12]="cherry";
add_node(&link_head,6,7,str);
add_node(&link_head,9,7,str);
showThe_link(link_head);
//free_node(&link_head);
showThe_link(link_head);
return 0;
}
uj5u.com熱心網友回復:
在free_node函式里有多處問題,1. printf("p_freeAid的值是:0X%x\n",p_freeAid->num);這句之前p_freeAid是野指標,這樣操作可能導致段錯誤;
2. printf("p_freeAid的值是:0X%x\n",p_free->next->num);這條列印也可能出現多錯誤,因為p_free不是NULL,不等于p_free->next不為NULL;
3. free(p_free);
printf("%d\n",p_free->num);
在釋放之后列印這條陳述句,結果是未定義的,因為已經釋放的空間,其內容具有不確定性,釋放的空間不能再次直接使用,需要重新malloc;
4. //*p_head=NULL;這句不能注釋掉,因為頭結點已經釋放掉了,為了保證后面對頭結點的使用不出現問題,這句需要加上(去掉注釋);
void free_node(STU **p_head)
{
STU*p_free;
STU*p_freeAid;
//printf("p_freeAid的值是:0X%x\n",p_freeAid->num);
p_free=*p_head;
if(*p_head==NULL){
printf("這個鏈表為空,無需釋放\n");
return;
}
//else{
while (p_free!=NULL) {
p_freeAid=p_free->next;
//printf("p_freeAid的值是:0X%x\n",p_free->next->num);
printf("p_freeAid的值是:0X%x\n",p_freeAid);
printf("p_free的值是:0X%x\n",p_free->next);
int num=p_free->num;
printf("%d\n",num);
free(p_free);
printf("%d\n",p_free->num);
p_free=p_freeAid;
}
//}
*p_head=NULL;
}
代碼邏輯可以稍微改一下,去掉else,
另外,列印指標建議用%p
uj5u.com熱心網友回復:
你好,首先非常感謝您的解答,我初學c,以前用Java模擬過鏈表,但是好像沒c語言要考慮的那么多。關于您的回答我還是有一些疑問。“printf("p_freeAid的值是:0X%x\n",p_freeAid->num);這句之前p_freeAid是野指標,這樣操作可能導致段錯誤”
關于這句話,P-freeAid 的指向,我認為明明是指向 p-free->next 的。 而且在執行這行代碼的時候,明明在free.next里面還是有值的。所以按照我的理解P-freeAid里面應該是有值的,而且 我debug里面, p-freeAid里面的“num”也是有值的,但是我用 printf函式調的時候,程式就進行不下去,所以就不太理解,所以還是希望您能就這點再給解答一下。
而且之前那個 showLink函式里面,我就把p_head->next的值賦給了p_mov。然后我在列印的時候 就是呼叫的 p_mov->num,來取值的。
在free函式里面 我用p_freeAid 來接收 p_free->next的值,然后同樣想呼叫 p_freeAid->num 來取值為什么就不行了呢?
費解中。。。。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/171390.html
標籤:C語言
