微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 结构体中动态内存的管理(malloc和free)

结构体中动态内存的管理(malloc和free)

时间:12-01 来源:互联网 点击:

strcpy(pstu->

pstu->

/*创建一块内存空间,并让pstu->

pstu->

strcpy(pstu->

pstu->

32 pstu->

35 strcpy(pstu->

(gdb) p pstu->name ----pstu->

36 pstu->

(gdb) p pstu->

$9 = 0x804a030 "Jimy" ----pstu->

pstu->

memset(pstu->

strcpy(pstu->

pstu->

char *ppstu = pstu->

/*释放的顺序要注意,pstu->

*如果pstu先释放,那么pstu->

free(pstu->

pstu->

24 pstu->

(gdb) p pstu->

27 strcpy(pstu->

(gdb) p pstu->

int num = MINOR(inode->

if(num >

filp->

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 "(24004"

(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 "(24004"

(gdb) p pp

$27 = 0x804a030 ""

(gdb) p pstu

$28 = (struct student *) 0x0

(gdb) p pstu->name

Cannot access memory at address 0x0

(gdb)

具体的调试过程说明了其中很多的问题,根据其中的结果可以知道,free结束以后指针变量P(malloc返回)中存储的地址值并没有改变,但是通过该地值已经不能访问之前的分配的存储空间。我采用其他的指针(直接赋值地址以及指针赋值)访问得到的结果也不是正确的值,虽然这不能说明地址中的数据改变了,但说明对释放以后的存储空间再通过其他方法访问不会得到正确的值,但是内存空间中存在值,并不一定是0,因此每一次malloc都清零是必要的。防止野指针也是非常必要的,减少程序错误的概率。

最后说明一下,链表作为结构体的衍生产物,链表的结构体中就有指针变量,因此一定草采用malloc等分配好内存块以后,再对链表进行操作,不然都会导致不同问题的产生。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top