直接上代碼
/**
* 定義 Teacher結(jié)構(gòu)體數(shù)據(jù)類型
* 本質(zhì) 固定內(nèi)存塊大小的別名
*/
typedef struct Teacher{
int age;//4字節(jié)
char name[64];//64字節(jié)
float weight;//4字節(jié)
}Teacher;
/**
* 初始化Teacher
* @param tea Teacher指針變量地址
* @return 初始化結(jié)果
*/
int creatTeacher(Teacher **tea){
Teacher *tmp = NULL;
tmp = (Teacher *)malloc(sizeof(Teacher));//72字節(jié)
if (tmp == NULL) {
return -1;
}
*tea = tmp;
return 0;
}
/**
* 釋放Teacher
* @param tea Teacher指針變量地址
* @return 釋放結(jié)果
*/
int freeTeacher(Teacher **teaOne){
Teacher **tmp = teaOne;
if (tmp != NULL) {
free(*teaOne);
}
//這里值得注意的是,釋放了內(nèi)存后還要對Teacher指針變量置NULL,防止出現(xiàn)野指針
*tmp = NULL;
if (*tmp == NULL) {
return 0;
}else {
return -1;
}
}
void safeFree(void **objPtr){
if (objPtr != NULL && *objPtr != NULL) {
free(*objPtr);
*objPtr = NULL;
}
}
int main(int argc, const char * argv[]) {
Teacher *teaOne = NULL;
int result = creatTeacher(&teaOne);
if (result == -1) {
printf("func creatTeacher error:%d\n",result);
return result;
}else {
char tName[64] = "wangweihu";
teaOne->age = 26;
teaOne->weight = 75;
//給字符串?dāng)?shù)組賦值的兩種方法
strcpy(teaOne->name,tName);
printf("老師的名字:%s, 體重:%fkg, 年齡:%d歲\n",teaOne->name, teaOne->weight, teaOne->age);
for (int i = 0; i<sizeof(tName); i++) {
teaOne->name[i] = tName[i];
}
printf("老師的名字:%s, 體重:%fkg, 年齡:%d歲\n",teaOne->name, teaOne->weight, teaOne->age);
int freeResult = freeTeacher(&teaOne);
if (freeResult == -1) {
printf("func freeTeacher error:%d\n",freeResult);
return freeResult;
}else {
return freeResult;
}
return result;
}
return 0;
}
解讀:
1.結(jié)構(gòu)體的定義
//定義
struct A {
int a; // 占4個字節(jié)
char b; // 占1個字節(jié)
short c; // 占2個字節(jié)
}颇蜡;
//定義并初始化
struct B {
int a; // 占4個字節(jié)
char b; // 占1個字節(jié)
short c; // 占2個字節(jié)
}B_demo = {10, 'w', 5}价说;
2.結(jié)構(gòu)體的初始化
3.結(jié)構(gòu)體的釋放
這里主要是安全釋放,這里要做到對任何指針類型的試用风秤,參數(shù)有必要改成void指針的指針鳖目,否則的話會報類型不匹配的警告。
void safeFree(void **objPtr){ if (objPtr != NULL && *objPtr != NULL) { free(*objPtr); *objPtr = NULL; }}
4.結(jié)構(gòu)體實用用例
將指針傳遞給函數(shù)時缤弦,是值傳遞领迈,函數(shù)里面拿到的也僅僅是一個拷貝指針,不會修改原指針的碍沐。如果我們想修改原指針而不是指針的副本狸捅,就需要傳遞指針的指針。
int creatTeacher(Teacher **tea){
Teacher *tmp = NULL;
tmp = (Teacher *)malloc(sizeof(Teacher));//72字節(jié)
if (tmp == NULL) {
return -1;
}
*tea = tmp;
return 0;
}
本例中傳遞的參數(shù)是結(jié)構(gòu)體指針的內(nèi)存地址累提,初始化完畢后尘喝,返回分配的指針;返回值是初始化結(jié)果刻恭。