首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言結構體指標傳遞函數:解構指標複製與直接賦值的編譯器行為

     編輯:關於C語言

C 語言結構體指標傳遞函數:解構指標複製與直接賦值的編譯器行為

結構體指標複製函數

void copy_teacher(Teacher *dst, const Teacher *src) {
    *dst = *src; // 解參考賦值:觸發逐成員複製
}

編譯器行為解析

  • *dst = *src 對結構體型別,編譯器產生 逐成員複製 代碼 (等同 memcpy(dst, src, sizeof(Teacher)))。
  • 若結構體含指標成員,屬於淺拷貝,指向同一記憶體,需自行深拷貝。
  • 直接賦值 t2 = t1 與 copy_teacher(&t2, &t1) 效果完全相同。

完整範例

#include <stdio.h>
#include <string.h>

typedef struct { char name[64]; int age, id; } Teacher;

void copy_teacher(Teacher *dst, const Teacher *src) { *dst = *src; }

int main() {
    Teacher t1 = {"Alice", 30, 1};
    Teacher t2, t3;

    t2 = t1;                    // 直接賦值
    copy_teacher(&t3, &t1);     // 函數指標複製

    printf("t2: %s %d\n", t2.name, t2.age);
    printf("t3: %s %d\n", t3.name, t3.age);
    return 0;
}

進階:含動態成員的深拷貝


typedef struct {
    char *name; // 動態分配
    int age;
} Person;

void deep_copy(Person *dst, const Person *src) {
    dst->age = src->age;
    dst->name = malloc(strlen(src->name)+1);
    strcpy(dst->name, src->name);
}
void free_person(Person *p) { free(p->name); }

總結

  • 無動態成員:*dst = *src / dst = src 皆可,編譯器處理複製。
  • 有動態成員:必須手寫深拷貝,並提供對應釋放函數。
  • 函數參數用 const Teacher *src 防止誤修改來源。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved