1. 程式人生 > >進階研究動態分配malloc()將野指標轉化為不"野"的指標

進階研究動態分配malloc()將野指標轉化為不"野"的指標




編寫連結串列時應注意指標的地址變化示注意 
如下所示: 

 
#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;
}