在函式中完成結構體的初始化
今天在實現一個單鏈表的時候,想借助一個函式完成連結串列頭節點的初始化
#include<stdio.h>
#include<stdlib.h>
// this program is to give an examble of single list
// this program contain three algorithem . those are insert,delect and print
typedef struct node{
int data;
struct node* next;
} Lnode;
int init(Lnode* head);
int main(void)
{
char ch;
Lnode *head;
int nodeData;
if(init(head))
printf("the head node has been assigned\n");
printf("%d",head->data); //---------------------->這裡出錯了
return 0;
}
int init(Lnode * head)
{
head=(Lnode*)malloc(sizeof(Lnode));
if(NULL==head)
{
printf("overflow");
exit(1);
};
head->next=NULL;
head->data=0;
return 1;
}
程式編譯,執行,當在main函式中引用head的值的時候,程式報錯並退出。經過仔細分析,在使用函式對head進行初始化的時候,指標的使用出啦問題:
這個問題可以這樣描述:程式呼叫init對和head進行初始化的時候,傳送啦head的值(一個隨機的地址),init函式中,head是一個臨時的指標,其存放的是主函式中傳遞過來的值。這個值又被分配的malloc分配的空間地址覆蓋。函式沒有返回值,所以當函式呼叫結束後,在子函式中分配的記憶體就被洩漏出去啦,找不到啦。主函式中的head指標的值沒有發生改變,指向一個隨機分配的空間,當引用這個指標的時候,就發生啦錯誤。
這個問題對指標使用有一定的啟示,在使用指標的函式呼叫中,指標的作用是傳遞它所指空間的地址,只能改變所指空間裡的內容,而不能改變源指標變數的值。