進階研究動態分配malloc()將野指標轉化為不"野"的指標
阿新 • • 發佈:2018-12-11
編寫連結串列時應注意指標的地址變化示注意 如下所示: #include<stdio.h> #include<stdlib.h> int main() { int *p, *a, *b,*c; p=a; //a=(int*)malloc(sizeof(int)); printf("%p %p\n",p,a); return 0; } 當兩個野指標賦值時.指標儲存的是相同的地址,但是動態分配後a的指標就不野了, 結論:動態分配的地址不是野地址是個穩定的地址,像分配初始地址一樣,根據此結論動態可以將野地址不再 "野"了 測試程式碼如下所示: 動態分配前: #include<stdio.h> #include<stdlib.h> int main() { int *p, *a, *b,*c; p=a; printf("%p %p\n",p,a); return 0; } 動態分配後: #include<stdio.h> #include<stdlib.h> int main() { int *p, *a, *b,*c; p=a; a=(int*)malloc(sizeof(int)); printf("%p %p\n",p,a); return 0; } //連結串列建立 #include<stdio.h> #include<stdlib.h> typedef struct Node{ int data; struct Node *Next; }ListNode; typedef struct Node* List; List Create_linklist(List h) { List head=h,p,s,r;//****注意指標如果沒有被賦初值,就去給其他指標賦值, /* int n; printf("please input num:\n"); scanf("%d", &n); head=(List)malloc(sizeof(ListNode));//定義頭節點 scanf("%d", &head->data); s=head; if(head==NULL) { printf("申請記憶體失敗"); return head; } for(int i=0;i<n-1;i++) { p=(List)malloc(sizeof(ListNode)); if(p==NULL) { printf("申請記憶體失敗!"); return p; } scanf("%d", &p->data); s->Next=p; s=p; } p->Next=NULL; return head; } List show_linklist(List h) { List p=h; printf("\n"); printf("輸出此連結串列:\n"); while(p!=NULL) { printf("%d ", p->data); p=p->Next; } printf("\n"); return h; } List Delete_linklist(List h) { List p=h; while(!p) { free(p); p=p->Next; } printf("此連結串列釋放成功!\n"); return h; } int main() { List L; L=Create_linklist(L); L=show_linklist(L); L=Delete_linklist(L); return 0; }