函式 GetEmployeeInfo 需填充員工資訊結構體:
typedef struct {
char szEmployeeName[100];
unsigned short iEmployeeAge;
unsigned int iEmployeeNo;
} TEmployeeInfo;
int GetEmployeeInfo(TEmployeeInfo *ptEmployeeInfo);
int main() {
TEmployeeInfo *ptEmployeeInfo = NULL;
GetEmployeeInfo(ptEmployeeInfo); // 函式內檢查 NULL 直接返回失敗
// 印出垃圾值或崩潰
}
指標為 NULL,函式無法寫入,調用者得到未初始化記憶體。
int main() {
TEmployeeInfo *ptEmployeeInfo = NULL;
// 直接對 NULL 指標解引用賦值 → 段錯誤
strcpy(ptEmployeeInfo->szEmployeeName, "Di Renjie"); // 崩潰!
GetEmployeeInfo(ptEmployeeInfo);
}
對 NULL 指標解引用直接導致 SIGSEGV。即使分配了記憶體,若函式內再次分配或修改指標指向,會造成記憶體洩漏或雙重釋放風險。
int main() {
TEmployeeInfo tEmployeeInfo = {0}; // 棟疊分配,自動初始化為 0
int ret = GetEmployeeInfo(&tEmployeeInfo); // 傳遞位址
if (ret == 0)
printf("姓名:%s 年齡:%d 工號:%d\n",
tEmployeeInfo.szEmployeeName,
tEmployeeInfo.iEmployeeAge,
tEmployeeInfo.iEmployeeNo);
return 0;
}
int GetEmployeeInfo(TEmployeeInfo *ptEmployeeInfo) {
if (!ptEmployeeInfo) return -1; // 防禦性檢查
strcpy(ptEmployeeInfo->szEmployeeName, "Li Yuanfang");
ptEmployeeInfo->iEmployeeAge = 100;
ptEmployeeInfo->iEmployeeNo = 123456;
return 0;
}
NULL。= {0} 或指定欄位),避免未初始化讀取。若函式需返回多個無關資料,可用多個輸出參數:
void GetEmployeeInfo(char *name, int *age, int *no); // 調用者提供緩衝區
// 或
typedef struct { char name[100]; int age; int no; } EmpOut;
int GetEmployeeInfo(EmpOut *out); // 結構體作為輸出載體
避免返回指向區域變數/靜態變數/動態記憶體的指標(除非明確文檔所有權轉移)。