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++都是這樣。