堆栈和堆栈问题与Structs - C编程

时间:2012-02-07 18:15:46

标签: c memory stack heap allocation

我有以下代码:

#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已在堆上分配,每个赋值也在堆上。

1 个答案:

答案 0 :(得分:1)

分配不在堆栈或堆上,对象是。

对象a在堆栈中,因为它是这样创建的:

struct A a;

要在堆上创建对象,必须使用malloc为它们分配内存。

尽管a在堆栈上,但a._pb_arr将在堆上。完成后,您必须明确free内存。遵循相同的推理,b位于堆栈上,pb位于堆上。

当您在数组a._pb_arr中分配对象时,将复制这些值,但它们仍然保留在堆上,因为您已将内存分配给a._pb_arr

为防止内存泄漏,您必须对freea._pb_arr使用pb