我有以下代码:
#include <stdlib.h>
#include <stdio.h>
struct B
{
int _arr[5];
};
struct A
{
struct B *_pb_arr;
};
int main()
{
int i,j;
struct B b;
struct B *pb = (struct B*)malloc(sizeof (struct B));
*pb = b;
struct A a;
a._pb_arr = (struct B*)malloc(sizeof (struct B)*2);
a._pb_arr[0] = b; //first question
a._pb_arr[1] = *pb; //second question
for (i=0;i<2;++i)
{
for (j=0;j<5;++j)
{
a._pb_arr[i]._arr[j] = i;
}
}
struct A a2 = a;
for (i=0;i<2;++i)
{
for (j=0;j<5;++j)
{
printf ("%d, ", a2._pb_arr[i]._arr[j]);
}
}
return 0;
}
我的问题是:为什么开启:a._pb_arr[0] = b;
分配在堆栈上。
并在下一行:a._pb_arr[1] = *pb
赋值是在堆上吗?
似乎a.pb_arr
已在堆上分配,每个赋值也在堆上。
答案 0 :(得分:1)
分配不在堆栈或堆上,对象是。
对象a
在堆栈中,因为它是这样创建的:
struct A a;
要在堆上创建对象,必须使用malloc
为它们分配内存。
尽管a
在堆栈上,但a._pb_arr
将在堆上。完成后,您必须明确free
内存。遵循相同的推理,b
位于堆栈上,pb
位于堆上。
当您在数组a._pb_arr
中分配对象时,将复制这些值,但它们仍然保留在堆上,因为您已将内存分配给a._pb_arr
。
为防止内存泄漏,您必须对free
和a._pb_arr
使用pb
。