<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 結(jié)構(gòu)體中動態(tài)內(nèi)存的管理(malloc和free)

          結(jié)構(gòu)體中動態(tài)內(nèi)存的管理(malloc和free)

          作者: 時間:2016-12-01 來源:網(wǎng)絡(luò) 收藏
          #include
          #include
          #include
          struct student
          {
          char *name;
          int score;
          }stu,*pstu;
          int main()
          {
          /*為name分配指向的一段內(nèi)存空間*/
          stu.name = (char *)malloc(20*sizeof(char));
          memset(stu.name,0,20*sizeof(char));
          strcpy(stu.name,"Jimy");
          stu.score = 99;
          /*為pstu分配指向的一段內(nèi)存空間*/
          pstu = (struct student *)malloc(sizeof(struct student));
          memset(pstu,0,sizeof(struct student));
          /*為name分配指向的一段內(nèi)存空間*/
          pstu->name = (char *)malloc(20*sizeof(char));
          memset(pstu->name,0,20*sizeof(char));
          strcpy(pstu->name,"Jimy");
          pstu->score = 99;
          /*采用另外的指針訪問分配的存儲空間,測試內(nèi)存中內(nèi)容是否改變*/
          char *p = stu.name;
          char *p1 = (char *)0x804a008;//具體的地址值
          char *ppstu = pstu->name;
          char *pp = (char *)0x804a030;//具體的地址值
          /*釋放的順序要注意,pstu->name必須在pstu釋放之前釋放,
          *如果pstu先釋放,那么pstu->name就不能正確的訪問。
          */
          free(pstu->name);
          free(stu.name);
          free(pstu);
          /*為了防止野指針產(chǎn)生*/
          pstu->name = NULL;
          stu.name = NULL;
          pstu = NULL;
          p = NULL;
          ppstu = NULL;
          return 0;
          }
          下面的全部是調(diào)試結(jié)果,根據(jù)調(diào)試結(jié)果說明問題:
          (gdb) r
          Starting program: /home/gong/program/cprogram/TestStructPoint
          Breakpoint 1, main () at TestStructPoint.c:14
          14 stu.name = (char *)malloc(20*sizeof(char));
          Missing separate debuginfos, use: debuginfo-install glibc-2.12.90-17.i686
          (gdb) p stu
          $1 = {name = 0x0, score = 0}
          (gdb) p stu.name
          $2 = 0x0
          (gdb) c
          Continuing.
          Breakpoint 2, main () at TestStructPoint.c:17
          17 strcpy(stu.name,"Jimy");
          (gdb) p stu.name
          $3 = 0x804a008 ""
          (gdb) c
          Continuing.
          Breakpoint 3, main () at TestStructPoint.c:21
          21 pstu = (struct student *)malloc(sizeof(struct student));
          (gdb) p stu.name
          $4 = 0x804a008 "Jimy"
          (gdb) p stu
          $5 = {name = 0x804a008 "Jimy", score = 99}
          (gdb) p pstu
          $6 = (struct student *) 0x0
          (gdb) c
          Continuing.
          Breakpoint 4, main () at TestStructPoint.c:24
          24 pstu->name = (char *)malloc(20*sizeof(char));
          (gdb) p pstu
          $7 = (struct student *) 0x804a020
          (gdb) p pstu->name
          $8 = 0x0
          (gdb) c
          Continuing.
          Breakpoint 5, main () at TestStructPoint.c:27
          27 strcpy(pstu->name,"Jimy");
          (gdb) p pstu->name
          $9 = 0x804a030 ""
          (gdb) c
          Continuing.
          Breakpoint 6, main () at TestStructPoint.c:31
          31 char *p = stu.name;
          (gdb) p pstu->name
          $10 = 0x804a030 "Jimy"
          (gdb) p *pstu
          $11 = {name = 0x804a030 "Jimy", score = 99}
          (gdb) p p
          $12 = 0x854ff4 "|M205"
          (gdb) c
          Continuing.
          Breakpoint 7, main () at TestStructPoint.c:32
          32 char *p1 = (char *)0x804a008;//具體的地址值
          (gdb) p p1
          $13 = 0x855ca0 ""
          (gdb) c
          Continuing.
          Breakpoint 8, main () at TestStructPoint.c:33
          33 char *ppstu = pstu->name;
          (gdb) p p1
          $14 = 0x804a008 "Jimy"
          (gdb) p ppstu
          $15 = 0x855ca0 ""
          (gdb) c
          Continuing.
          Breakpoint 9, main () at TestStructPoint.c:34
          34 char *pp = (char *)0x804a030;//具體的地址值
          (gdb) p ppstu
          $16 = 0x804a030 "Jimy"
          (gdb) p pp
          $17 = 0x804826a "__libc_start_main"
          (gdb) c
          Continuing.
          Breakpoint 10, main () at TestStructPoint.c:37
          37 free(pstu->name);
          (gdb) p pp
          $18 = 0x804a030 "Jimy"
          (gdb) p pstu->name
          $19 = 0x804a030 "Jimy"
          (gdb) c
          Continuing.
          Breakpoint 11, main () at TestStructPoint.c:38
          38 free(stu.name);
          (gdb) p pstu->name
          $20 = 0x804a030 ""
          (gdb) c
          Continuing.
          Breakpoint 12, main () at TestStructPoint.c:39
          39 free(pstu);
          (gdb) p stu.name
          $21 = 0x804a008 "(240看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();