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++都是这样。



 

<think>我们参考了用户提供的引用内容,其中引用[1]和引用[2]涉及结构体的赋值和初始化。用户当前的问题是“结构体初始赋值的方法”,因此我们将重点讲解结构体初始化的几种方法。 根据引用[1]:结构体可以整体赋值,如`b = a;`,但这不是初始化,而是赋值。初始化是在定义时给变量赋初值。 根据引用[2]:结构体可以在定义时通过初始化列表为成员赋值,也可以在定义结构体类型时为成员指定默认值(C++11或以上,C语言不支持)。 因此,我们分C语言和C++两种情况来回答(因为用户提供的引用中混合了C和C++代码,且问题中没有明确指定语言,但TLE问题通常使用C++,而结构体初始赋值在两种语言中有差异): 1. C语言中结构体初始赋值的方法: - 初始化列表:在定义结构体变量时使用花括号{}初始化。 - 注意:C语言不允许在定义结构体类型直接给成员指定默认值(这是C++的特性)。 2. C++中结构体初始赋值的方法: - 初始化列表(与C类似) - 在定义结构体类型直接给成员指定默认值(C++11及以上) - 构造函数初始化 下面详细说明: </think>### 结构体初始赋值方法详解 结构体初始赋值可分为**声明时初始化**、**定义后赋值**和**构造函数初始化**三类方法,以下是具体实现方式: #### 1. 声明时初始化(推荐) 在定义结构体变量直接初始化,支持整体赋值和成员单独赋值: ```cpp // 整体初始化(C/C++通用) struct Point { int x; double y; } p1 = {5, 3.14}; // 整体赋值[^2] // 成员单独初始化(C++11起支持) struct Student { string name = "Unknown"; // 默认值 int score = 60; } stu; ``` #### 2. 定义后赋值 结构体变量定义后,可通过以下方式赋值: ```cpp // 整体拷贝赋值(浅拷贝) Point p2; p2 = p1; // 将p1所有成员值复制到p2[^1] // 成员单独赋值 p2.x = 10; p2.y = 2.71; ``` #### 3. 构造函数初始化(C++专用) 通过构造函数实现灵活初始化: ```cpp struct Rectangle { int width, height; // 自定义构造函数 Rectangle(int w = 1, int h = 1) : width(w), height(h) {} }; Rectangle r1; // 使用默认值 width=1, height=1 Rectangle r2(10, 20); // 初始化 width=10, height=20 ``` #### ⚠️ 注意事项 1. **数组赋值限制** 结构体包含数组时不能直接赋值,需逐元素操作或使用`memcpy`[^3]: ```cpp struct Data { int arr[3]; }; Data d1 = {{1,2,3}}; // 声明时初始化允许 // d2.arr = {4,5,6}; // 错误!定义后不能直接赋数组 ``` 2. **深浅拷贝问题** 当结构体包含指针成员时,赋值操作执行**浅拷贝**(仅复制指针地址): ```cpp struct Node { int* ptr; }; Node a{new int(5)}; Node b = a; // b.ptr与a.ptr指向同一内存 *b.ptr = 10; // 同时修改*a.ptr ``` 3. **外部数据初始化** 可通过配置文件初始化结构体(Linux常见实践)[^5]: ```cpp read_conf_init_info("config.txt", &attr); ``` ### 代码示例 ```cpp #include <iostream> using namespace std; struct Book { int id = 0; // C++11成员默认值 string title = "Untitled"; }; int main() { // 1. 声明时初始化 Book b1 = {101, "C++ Primer"}; // 2. 定义后赋值 Book b2; b2 = b1; // 整体拷贝 b2.id = 102; // 成员修改 // 3. 输出验证 cout << b1.id << " " << b1.title << endl; // 101 C++ Primer cout << b2.id << " " << b2.title << endl; // 102 C++ Primer } ``` --- ### 相关问题 1. 结构体包含指针成员时如何实现深拷贝? 2. C++11的列表初始化与结构体初始化有何关联? 3. 如何通过JSON配置文件初始化结构体? 4. 结构体默认构造函数在什么情况下会被隐式生成? [^1]: 引用结构体整体赋值示例 [^2]: 引用成员默认值初始化语法 [^3]: 引用数组名作为常量指针的特性 [^5]: 引用配置文件初始化结构体的实现方法
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值