malloc和free——結構體中動態記憶體的管理
阿新 • • 發佈:2019-01-31
下面的全部是除錯結果,根據除錯結果說明問題:
(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 "|M\205" (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\004\b" (gdb) p pstu $22 = (struct student *) 0x804a020 (gdb) p *pstu $23 = {name = 0x804a030 "", score = 99} (gdb) c Continuing. Breakpoint 13, main () at TestStructPoint.c:41 41 pstu->name = NULL; (gdb) p *pstu $24 = {name = 0x0, score = 99} (gdb) p pstu->name $25 = 0x0 (gdb) c Continuing. Breakpoint 14, main () at TestStructPoint.c:47 47 return 0; (gdb) p p1 $26 = 0x804a008 "(\240\004\b" (gdb) p pp $27 = 0x804a030 "" (gdb) p pstu $28 = (struct student *) 0x0 (gdb) p pstu->name Cannot access memory at address 0x0 (gdb)