struct類型的賦值

struct 類型變量賦值,一直感覺有危險,畏手畏腳。

 

 

#include<iostream>
using namespace std;


struct node{
	struct addr *ad;
	node *next;

};

struct addr{

	char *city;
	int code;

};



int main(){

	char *c = "beijing";
	char *city ; 
	city = c;

	struct addr *ad = new addr(); 
	ad->city = city;
	ad->code = 910293;

	struct node *newnode = new node();
	newnode->ad = ad;
	newnode->next = NULL;
	printf("%s %d\n",newnode->ad->city,newnode->ad->code);


	struct node *newnode1 = new node();			//可以直接賦值,但是newnode
	newnode1 = newnode;
	printf("%s %d\n",newnode1->ad->city,newnode1->ad->code);//沒問題

	//delete []newnode;		//將newnode內存撤銷
	//printf("%s %d\n",newnode1->ad->city,newnode1->ad->code);//異常終止,

	struct node *newnode2 = new node();
	newnode2->ad = newnode->ad;
	printf("%s %d\n",newnode1->ad->city,newnode1->ad->code);//沒問題

	delete []newnode->ad->city;//撤銷newnode->ad->city
	printf("%d\n",newnode2->ad->code);//依然異常終止
}

 

struct變量可以直接賦值,但是當結構體內有指針時就會不安全,因爲直接賦值,使兩個指針指向了同一塊內存,當其中一個指針釋放時,會導致另一個指針指向非法的位置。

 

對於上面的結構體該怎麼賦值呢?

memcpy是一種方法:

        struct node *newnode3 = new node();
	memcpy(newnode3,newnode,sizeof(node));
	delete []newnode;		//將newnode內存撤銷
	printf("%s %d\n",newnode3->ad->city,newnode3->ad->code);


 

c和c++都是這樣。



 

發佈了24 篇原創文章 · 獲贊 6 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章