【C 语言】结构体 ( 结构体浅拷贝 )
生活随笔
收集整理的這篇文章主要介紹了
【C 语言】结构体 ( 结构体浅拷贝 )
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 一、結構體淺拷貝與深拷貝
- 二、結構體淺拷貝
- 三、結構體淺拷貝代碼示例
一、結構體淺拷貝與深拷貝
結構體 中 嵌套了 指針 , 指針指向的內存 , 如果需要 malloc 在堆內存中 分配內存 , 如果在 該類型 結構體變量 之間互相賦值 ,
- 如果直接賦值 , 就是淺拷貝 ;
- 如果賦值時 , 重新為 指針變量 在堆內存中重新申請內存 , 拷貝數據 , 就是 深拷貝 ;
淺拷貝 只會 拷貝 指針變量的值 , 不會拷貝 指針變量 指向的 內存空間的 數據 ;
二、結構體淺拷貝
結構體淺拷貝 : 下面兩種方式的拷貝 , 是結構體的淺拷貝 ;
- 直接拷貝結構體內存 :
- 使用 = 操作拷貝 : 只會將 結構體 變量的 內存 , 從 from 指針指向的地址 , 拷貝到 to 指針指向的地址 ;
三、結構體淺拷貝代碼示例
代碼示例 :
#include <stdio.h> #include <stdlib.h> #include <string.h>/*** @brief The Student struct* 定義 結構體 數據類型 , 同時為該結構體類型聲明 別名* 可以直接使用 別名 結構體變量名 聲明結構體類型變量* 不需要在前面添加 struct 關鍵字*/ typedef struct Student {// 聲明變量時 , 會自動分配這 5 字節內存// 賦值時 , 可以直接使用 = 賦值字符串char name[5];int age;// 聲明變量時 , 只會為 4 字節指針分配內存// 具體的 字符串內存 需要額外使用 malloc 申請內存// 賦值時 , 必須使用 strcpy 函數 , 向堆內存賦值char *address; }Student;/*** @brief copy_student 執行淺拷貝操作* @param to* @param from*/ void copy_student(Student *to, Student *from) {// 結構體內存拷貝// 該拷貝是淺拷貝memcpy(to, from, sizeof (Student));// 結構體直接賦值 , 與上面的代碼作用相同// 該拷貝也是淺拷貝//*to = *from; }/*** @brief 主函數入口* @return*/ int main(int argc, char* argv[], char**env) {Student s1;Student s2;// 為 s1.age 賦值s1.age = 18;// 為 s1.name 賦值// 該成員是 數組 , 在 s1 結構體變量聲明時 , 就分配好了內存strcpy(s1.name, "Tom");// 給 s1.address 在堆內存分配內存s1.address = (char *)malloc(20);strcpy(s1.address, "Beijing");// 將 s1 賦值給 s2copy_student(&s2, &s1);printf("s1 : name = %s, age = %d, address = %s\n", s1.name, s1.age, s1.address);printf("s2 : name = %s, age = %d, address = %s\n", s2.name, s2.age, s2.address);// 命令行不要退出system("pause");return 0; }執行結果 :
s1 : name = Tom, age = 18, address = Beijing s2 : name = Tom, age = 18, address = Beijing 請按任意鍵繼續. . .總結
以上是生活随笔為你收集整理的【C 语言】结构体 ( 结构体浅拷贝 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C 语言】二级指针内存模型 ( 指针数
- 下一篇: 【C 语言】结构体 ( 指针运算与指针内