指向结构的指针的malloc/free问题

时间:2022-11-21 10:42:21
环境:VS2010
代码如下:
#include <stdio.h>
#include <stdlib.h>

struct B {
int data_b;
};
struct A {
int data_a;
struct B b;
};

int main() {
struct A *pa;
struct B *pb;
pa = (struct A *) malloc (sizeof(struct A));
//pb = (struct B *) malloc (sizeof(struct B));
pa->data_a = 5;
pb = &pa->b;
pb->data_b = 6;
printf("%d %d\n", pa->data_a, pb->data_b);
system("pause");
//free(pb);
free(pa);
return 0;
}


执行后,正确输出 5 6

但如果加上注释的那两行,VS报错如下:

Windows 已在 ***.exe 中触发一个断点。

其原因可能是堆被损坏,这说明 ***.exe 中或它所加载的任何 DLL 中有 Bug。

原因也可能是用户在 ***.exe 具有焦点时按下了 F12。

输出窗口可能提供了更多诊断信息。



请问为何会出现此错误。
在此情况下,pb只作为指向另一结构的指针,是否无需用malloc分配内存?

5 个解决方案

#1


操作都是在pa申请的内存上进行的,pb是不需要分配内存的了。。

#2


引用 1 楼  的回复:
操作都是在pa申请的内存上进行的,pb是不需要分配内存的了。。

加上那两句会内存泄露,而且,free那里会有问题,不是自己分配的内存,就不要自己free

#3


 pb = &pa->b;
在malloc a的时候,已经给b分配内存了,就不需要你自己分配,不是你自己分配的内存,就不用你free

#4


    //pb = (struct B *) malloc (sizeof(struct B));
    pb = &pa->b;
如果第一条语句没有被注释,那么此时pb指向你申请的一块空间
第二条语句将pb指向pa相关的一块空间,pb原有的数据被覆盖。此时之前你申请的那块空间你已经没有办法以任何方式访问,即内存泄露。
   //free(pb);
此时,你试图释放的pb并没有指向你最初申请的那块空间,因此释放出错

别死记硬背“一个malloc对应一个free,指针不malloc不能使用”。虽然这些话本身都是正确的,但如果你不明白为什么,哪怕背上一万条禁令,你也一样能发明出第一万零一种错误来。

#5


好吧,我说下我的理解:
    环境:我用的ubuntu 12.04  gcc 4.6.1
    问题出在”free(pb);“这一句。在”pb = &pa->b;“这里,你已经将pb的指针更改为struct A中成员b的地址了,所以不能再将这个指针作为free的参数,因为这个指针不是由malloc申请来的。记得以前好像看过,free的参数必需同是由malloc或类似的函数申请内存时反回的指针。
    另外”pb= (struct B *) malloc (sizeof(struct B));“这句,由于你修改了pb指针,这块申请的内存由于指针丢失已经没办法free了,产生了内存泄漏问题。

我单注释“free(pb);”这句时编译后执行,系统反回:
5 6
sh: 1: pause: not found

出现“sh: 1: pause: not found”这句的原因是我的系统中没有"pause"这个命令。


#1


操作都是在pa申请的内存上进行的,pb是不需要分配内存的了。。

#2


引用 1 楼  的回复:
操作都是在pa申请的内存上进行的,pb是不需要分配内存的了。。

加上那两句会内存泄露,而且,free那里会有问题,不是自己分配的内存,就不要自己free

#3


 pb = &pa->b;
在malloc a的时候,已经给b分配内存了,就不需要你自己分配,不是你自己分配的内存,就不用你free

#4


    //pb = (struct B *) malloc (sizeof(struct B));
    pb = &pa->b;
如果第一条语句没有被注释,那么此时pb指向你申请的一块空间
第二条语句将pb指向pa相关的一块空间,pb原有的数据被覆盖。此时之前你申请的那块空间你已经没有办法以任何方式访问,即内存泄露。
   //free(pb);
此时,你试图释放的pb并没有指向你最初申请的那块空间,因此释放出错

别死记硬背“一个malloc对应一个free,指针不malloc不能使用”。虽然这些话本身都是正确的,但如果你不明白为什么,哪怕背上一万条禁令,你也一样能发明出第一万零一种错误来。

#5


好吧,我说下我的理解:
    环境:我用的ubuntu 12.04  gcc 4.6.1
    问题出在”free(pb);“这一句。在”pb = &pa->b;“这里,你已经将pb的指针更改为struct A中成员b的地址了,所以不能再将这个指针作为free的参数,因为这个指针不是由malloc申请来的。记得以前好像看过,free的参数必需同是由malloc或类似的函数申请内存时反回的指针。
    另外”pb= (struct B *) malloc (sizeof(struct B));“这句,由于你修改了pb指针,这块申请的内存由于指针丢失已经没办法free了,产生了内存泄漏问题。

我单注释“free(pb);”这句时编译后执行,系统反回:
5 6
sh: 1: pause: not found

出现“sh: 1: pause: not found”这句的原因是我的系统中没有"pause"这个命令。