結構體巢狀二級指標和一級指標 釋放時出現的問題

2021-10-08 21:38:34 字數 1840 閱讀 4935

發現問題所在,應釋放main函式p指向的記憶體,而不是freeteacher函式裡p指向的記憶體

#define _crt_secure_no_warnings

#include

#include

#include

#include

// 4. 重寫結構體巢狀一級指標老師和二級指標學生的**

//結構體型別,每個導師有三個學生

typedef struct teacher

teacher;

//在createteacher中分配空間

int createteacher(teacher **p/out/, int n1, int n2)

for (i = 0; i < n1; i++)

}*p = q;

return 0;

}//給成員賦值

void initteacher(teacher *p, int n1, int n2)

for (i = 0; i < n1; i++)

p[i].age = i + 1;

}return 0;

//列印結構體成員資訊

void printteacher(teacher *p, int n1, int n2)

printf("\n");

printf("\n");

for (i = 0; i < n1; i++)

printf("第%d個導師的年齡:", i + 1);

printf("%d", p[i].age);

printf("\n");

}return 0;//根據導師名字排序, 降序

void sortteacher(teacher *p, int n1)

}

}

return 0;

//釋放空間,在函式內部把p賦值為null

void freeteacher(teacher **p, int n1, int n2)

}

}

for (i = 0; i < n1; i++)

if (q[i].tname != null) }

if (*p != null)

return 0;

int main()

initteacher(p, n1, n2); //給成員賦值

//列印成員,排序前

printf("排序前:\n");

printteacher(p, n1, n2);

//根據導師名字排序, 降序

sortteacher(p, n1);

//列印成員,排序後

printf("\n排序後:\n");

printteacher(p, n1, n2);

//釋放空間,在函式內部把p賦值為null

freeteacher(&p, n1, n2);

system("pause");

return 0;

一級指標和二級指標

通常用作函式的輸入引數,因為一級指標作為函式引數,在呼叫的時候,實參和形參是不同的記憶體空間,只是,這個記憶體空間存放的指標指向的是同一塊位址,所以形參在函式執行中可以訪問實參指向的記憶體空間,但是形參的指向的改變並不能影響實參。總結一句話 一級指標做函式引數,在函式內做形參做重新指向並 不會影響實...

一級指標二級指標

例如 int p null int代表指標p指向的資料型別是int型,代表這是乙個指標變數,1 指標變數儲存的內容是指向的變數的位址 2 在使用sizeof判斷指標的位元組數時,在32位機器上為4個位元組,在64位機器上為了相容,仍然是四個位元組大小 3 小知識點,不同型別的指標除了指向的變數資料型...

一級指標與二級指標

如下圖所示,整型指標xptr指向變數x的位址。原始碼 include int main 實現方法一如下圖所示,先為二級整型指標ptr分配空間,然後賦值。原始碼 include include int main printf n return 0 執行結果 實現方法二 如下圖所示,先為二級整型指標pt...