C語言:結構體中一級指針和二級指針的創建與釋放示例

http://blog.csdn.net/Bixiwen_liu/article/details/53610952

這幾天把C語言鞏固了一下,作為一門最基本的編程語言,C語言還是相當基礎和非常重要的,個人認為C語言還是很有必要學好吃透的。

今天寫的話題是結構體結構體中一級指針和二級指針的創建與釋放,以一個例子來說明,筆者這里自己敲得代碼,雖然用C語言幾年了,但是有的東西還是會遺忘。筆者敲代碼過程中也是有bug出現的,經過調試也找到了bug所在,不得不說,鞏固也是很重要的。而結構體作為C語言一部分也是很重要的,指針作為C語言的半壁江山也保持著其重要地位。代碼不是很長,但里面有很多細節的考慮,特別是一級指針和二級指針的內存的申請和釋放。

代碼的主要表達是:有三個老師,每個老師都有屬性名字,年齡,別名,編號,以及有三個學生名字。老師名字(name)的內存分配是在棧區,別名(alisname)和學生名(stuname)的內存分配是在堆區。個人認為C語言的內存四區(棧區,堆區,全局區,代碼區)很重要,所以喜歡從內存四區的角度看代碼,對理解C語言的本質是重要,也是理解bug所在的重要原因。

下面是示例代碼:


[cpp]?view plain?copy
  1. //?結構體?示例??
  2. #include?"stdio.h"??
  3. #include?"stdlib.h"??
  4. #include?"string.h"??
  5. ??
  6. typedef?struct?Teacher?//?定義一個結構體,名稱為Teacher??
  7. {??
  8. ????char?name[64];??
  9. ????int?age;??
  10. ????char?*alisname;//別名??
  11. ????char?**stuname;??
  12. ????int?id;??
  13. }Teacher;??
  14. ??
  15. int?createTeacher(Teacher?**pT,?int?num)??
  16. {??
  17. ????int?i?=?0;??
  18. ????int?j?=?0;??
  19. ????int?ret?=?0;??
  20. ????Teacher?*tmp?=?NULL;??
  21. ??
  22. ????tmp?=?(Teacher?*)malloc(num?*?sizeof(Teacher));??
  23. ????if?(tmp?==?NULL)??
  24. ????{??
  25. ????????ret?=?-1;??
  26. ????????printf("malloc?err:?%d\n",ret);??
  27. ????????return?ret;??
  28. ????}??
  29. ????memset(tmp,?0,?num?*?sizeof(Teacher));??
  30. ??
  31. ????for?(i?=?0;?i?<?num;?i++)??
  32. ????{??
  33. ????????char?**myp?=?NULL;??
  34. ??????????
  35. ????????//先創建一級指針??
  36. ????????tmp[i].alisname?=?(char?*)malloc(60);??
  37. ????????if?(?tmp[i].alisname?==?NULL)??
  38. ????????{??
  39. ????????????ret?=?-2;??
  40. ????????????printf("malloc?tmp[i].alisname?err:?%d\n",ret);??
  41. ????????????return?ret;??
  42. ????????}??
  43. ??
  44. ????????//再創建二級指針??
  45. ????????myp?=?(char?**)malloc(3?*?sizeof(char?*));??
  46. ????????if?(myp?==?NULL)??
  47. ????????{??
  48. ????????????ret?=?-3;??
  49. ????????????return?ret;??
  50. ????????}??
  51. ????????for?(j?=?0;?j?<?3;?j++)??
  52. ????????{??
  53. ????????????myp[j]?=?(char?*)malloc(60);??
  54. ????????????if?(myp[j]?==?NULL)??
  55. ????????????{??
  56. ????????????????ret?=?-4;??
  57. ????????????????return?ret;??
  58. ????????????}??
  59. ????????}??
  60. ????????tmp[i].stuname?=?myp;??
  61. ????}??
  62. ??
  63. ????*pT?=?tmp;??
  64. ????return?ret;??
  65. }??
  66. ??
  67. int?printTeacherandStu(Teacher?*p,?int?num)??
  68. {??
  69. ????int?i?=?0;??
  70. ????int?j?=?0;??
  71. ????int?ret?=?0;??
  72. ????Teacher?*tmp?=?NULL;??
  73. ??
  74. ????if?(p?==?NULL)??
  75. ????{??
  76. ????????ret?=?-1;??
  77. ????????printf("p?is?null?:?%d\n",ret);??
  78. ????????return?ret;??
  79. ????}??
  80. ????tmp?=?p;??
  81. ??
  82. ????for?(i?=?0;?i?<?num;?i++)??
  83. ????{??
  84. ????????char?**myp?=?NULL;??
  85. ??????????
  86. ????????printf("teacher?name:?%s\n",tmp[i].name);??
  87. ????????printf("?teacher?alisname:?%s\n",tmp[i].alisname);??
  88. ??
  89. ????????printf("??student's?name:??");??
  90. ????????myp?=?tmp[i].stuname;??
  91. ????????for?(j?=?0;?j?<?3;?j++)??
  92. ????????{??
  93. ????????????printf("%s??",myp[j]);??
  94. ????????}??
  95. ????????printf("\n");?????
  96. ????}??
  97. ????return?ret;??
  98. ??
  99. }??
  100. ??
  101. void?FreeTeacher(Teacher?*p,?int?num)??
  102. {??
  103. ????int?i?=?0;??
  104. ????int?j?=?0;??
  105. ????Teacher?*tmp?=?NULL;??
  106. ??
  107. ????tmp?=?p;??
  108. ??
  109. ????for(i?=?0;?i?<?num;?i++)??
  110. ????{??
  111. ????????char?**myp?=?NULL;??
  112. ????????//先釋放以及指針??
  113. ????????if?(tmp[i].alisname?!=?NULL)??
  114. ????????{??
  115. ????????????free(tmp[i].alisname);??
  116. ????????}??
  117. ??
  118. ????????//再釋放二級指針??
  119. ????????if?(tmp[i].stuname?!=?NULL)??
  120. ????????{??
  121. ????????????myp?=?tmp[i].stuname;??
  122. ????????????for?(j?=?0;?j?<?3;?j++)??
  123. ????????????{??
  124. ????????????????if?(myp[j]?!=?NULL)??
  125. ????????????????{??
  126. ????????????????????free(myp[j]);??
  127. ????????????????}??
  128. ????????????}??
  129. ????????????free(myp);??
  130. ????????????tmp[i].stuname?=?NULL;??
  131. ????????}?????
  132. ????}??
  133. ????free(tmp);??
  134. }??
  135. ??
  136. int?main()??
  137. {??
  138. ????int?ret?=?0;??
  139. ????int?i?=?0;??
  140. ????int?j?=?0;??
  141. ????int?num?=?3;??
  142. ????Teacher?*pArray?=?NULL;??
  143. ??
  144. ????ret?=?createTeacher(&pArray,?num);??
  145. ????if?(ret?!=?0)??
  146. ????{??
  147. ????????printf("func?createTeacher()?err:?%d\n",ret);??
  148. ????????return?ret;??
  149. ????}??
  150. ??
  151. ????for?(i?=?0;?i?<?num;?i++)??
  152. ????{??
  153. ????????printf("\nplease?input?teacher's?name:");??
  154. ????????scanf("%s",pArray[i].name);??
  155. ??
  156. ????????printf("\n?please?input?teacher's?age:");??
  157. ????????scanf("%d",&(pArray[i].age));??
  158. ??
  159. ????????printf("\n?please?input?teacher's?alsname:");??
  160. ????????scanf("%s",pArray[i].alisname);??
  161. ??
  162. ????????for?(j?=?0;?j?<?3;?j++)??
  163. ????????{??
  164. ????????????printf("\n??please?input?student?name:");??
  165. ????????????scanf("%s",pArray[i].stuname[j]);??
  166. ????????}??
  167. ????}??
  168. ??
  169. ????ret?=?printTeacherandStu(pArray,?num);??
  170. ????if?(ret?!=?0)??
  171. ????{??
  172. ????????ret?=?-2;??
  173. ????????printf("func?printTeacherandStu()?err:?%d\n",ret);??
  174. ????????return?ret;??
  175. ????}??
  176. ??
  177. ????FreeTeacher(pArray,?num);??
  178. ????return?0;??
  179. }??

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384030.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384030.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384030.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

帶環迷宮求最短路徑

前面介紹了簡單的迷宮求解問題, 今天我們就對帶環迷宮求出它的最短路徑 1.首先來看一個帶環迷宮的簡單地圖 在這張迷宮地圖中,我們規定入口點的位置entry的坐標是 (0, 1), 同時, 我們給入口點傳一個非法坐標,作為入口點的前一個位置(-1, -1). 接下來的思路就和上一篇的思路是一…

UVa1583

【題目描述】 傳送門 【題目分析】 我以為很簡單就寫了一個暴力沒有想到超時了。應該是T是非常大的所以必須得打表&#xff0c;將所有的結果都儲存起來然后直接輸出。 以后遇到這種可以一下算出所有結果的多組數據最好還是算出所有的結果然后再輸出答案。 【AC代碼】 #inc…

C 結構體嵌套一級指針 二級指針 動態分配內存

https://blog.csdn.net/xielinhua88/article/details/51364623 點擊打開鏈接 #define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <string.h> #include <stdio.h> //結構體嵌套一級指針 二級指針 動態分配內存 typedef struct _Teacher { int ag…

線程的同步與互斥

1. 互斥量 在Linux 下線程使用的都是局部變量, 而我們知道, 每一個線程都獨立擁有自己的一個棧, 而這些局部便令就在棧中,而線程的創建就是為了實現通信, 此時線程之間無法共享這些變量 ????為了使得線程之間能夠共享數據, 一次我們可以創建一個全局變量, 此時線程都在進程…

二級指針與指針數組的關系

http://blog.csdn.net/shuaishuai80/article/details/6129742 #include <stdio.h> void test(char *argv[]); int main(void) { char *argv[3]{{"abcdefg"},{"1234567"},{"q1w2e3r"}}; test(argv); /*調用指針數組…

UVa1584

【題目描述】 傳送門 【題目分析】 也是一道簡單的模擬題&#xff0c;1A嘿嘿嘿。 再看書發現和書上的做法差不多。 【AC代碼】 #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<queue> #include<cstd…

cf#582div3 D——暴力

【題目描述】 The only difference between easy and hard versions is the number of elements in the array.You are given an array a consisting of n integers. In one move you can choose any ai and divide it by 2 rounding down (in other words, in one move you c…

C語言 可變參數

http://www.cnblogs.com/zhanggaofeng/p/6434554.html //可變參數 #include <stdio.h> #include <stdlib.h> #include <string.h> //引用頭文件 #include <stdarg.h>/* va_list用于聲明一個變量&#xff0c;我們知道函數的可變參數列表其實就是一個字符…

UVa1585

【題目描述】 傳送門 【題目分析】 氵 【AC代碼】 #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<queue> #include<cstdlib> #include<set> #include<map> #include<vector>u…

c語言經典算法——查找一個整數數組中第二大數

https://www.cnblogs.com/dootoo/p/4473958.html 題目&#xff1a; 實現一個函數&#xff0c;查找一個整數數組中第二大數。 算法思想&#xff1a; 設置兩個變量max1和max2&#xff0c;用來保存最大數和第二大數&#xff0c;然后將數組剩余的數依次與這兩個數比較&#xff0c;如…

進程間關系和守護進程

一. 進程組/作業/會話 1.進程組 每一個進程除了有一個進程ID之外, 還屬于一個進程組. 進程是一個或多個進程的集合. 通常, 它們與同一個作業向關聯, 可以接收來自同一個終端下的各種命令,信號. 每一個進程組都有唯一的進程組 ID. 每一個進程組都可以有一個組長進程. 組長進程的…

UVa1586

【題目描述】 傳送門 【題目分析】 氵 【AC代碼】 #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<queue> #include<cstdlib> #include<set> #include<map> #include<vector> …

猴子偷桃問題

http://blog.csdn.net/snow_5288/article/details/52561882 問題描述&#xff1a; /*有一群猴子&#xff0c;去摘了一堆桃子*/ /*商量之后決定每天吃剩余桃子的一半*/ /*當每天大家吃完桃子之后&#xff0c;有個貪心的小猴都會偷偷再吃一個桃子*/ /*按照這樣的方式猴子們每天都…

UVa1225

【題目描述】 傳送門 【題目分析】 做題做多了慢慢都忘記暴力了&#xff0c;想要快速算出來&#xff0c;找到規律&#xff0c;但是找來找去好復雜的都沒有找到&#xff0c;然后寫了一個不能再暴力的寫法&#xff0c;就過了。。。 我還是覺得如果數據范圍變成1e9那種級別的還…

linux 線程學習之條件變量

http://blog.csdn.net/hemmanhui/article/details/4417433 互斥鎖&#xff1a;用來上鎖。 條件變量&#xff1a;用來等待&#xff0c;當條件變量用來自動阻塞一個線程&#xff0c;直到某特殊情況發生為止。通常條件變量和互斥鎖同時使用。 函數介紹&#xff1a; 1&#xff0e;…

UVa455

【題目描述】 傳送門 【題目分析】 就是一個簡單的暴力&#xff0c;只是需要注意輸出格式比較毒瘤。 【AC代碼】 #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<iostream> #include<cmath> #i…

網絡相關基礎概念

一. 相關基礎概念 1.計算機網絡的特點 (1)連通性:計算機網絡使得上網的用戶都能夠彼此相連, 好像用戶的計算機可以直接相連 ????(2)資源共享:資源共享可以是信息共享, 軟件共享, 硬件共享等等. 由于網絡的存在, 使得用戶感覺資源就在自己身邊 2. 網絡 網絡是由若干結點和…

linux線程同步(2)-條件變量

https://www.cnblogs.com/yuuyuu/p/5140875.html linux線程同步(2)-條件變量 一.概述 上一篇&#xff0c;介紹了互斥量。條件變量與互斥量不同&#xff0c;互斥量是防止多線程同時訪問共享的互斥變量來保護臨界區。條件變量…

UVa227

【題目描述】 傳送門 【題目分析】 題目的意思很簡單&#xff0c;只是輸入輸出很毒瘤&#xff0c;我一開始用的fgets然后用scanf(" ")吃掉所有的空格和換行&#xff0c;可是這樣有可能將迷宮的空格吃掉&#xff08;例如這個空格恰好在第一行第一列&#xff09;。 …

點對點數據鏈路層

數據鏈路層的主要功能將數據轉換為相應的比特流使用的信道主要有點對點的信道方式(一對一的方式), 以及廣播的信道方式 一. 點對點信道的數據鏈路層 1. 數據鏈路和數據幀 鏈路就是從一個結點連接到相鄰結點的一段物理線路(有線或者無線), 期間不準有任何的交換結點, 因此兩臺…