Проблемы с кучей и стеком в Structs - программирование на C - PullRequest
2 голосов
/ 07 февраля 2012

У меня есть следующий код:

#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 Ответ

1 голос
/ 07 февраля 2012

Назначения не в стеке или куче, объекты.

Объект a находится в стеке, потому что он создан так:

struct A a;

Чтобы создать объекты в куче, вы должны выделить для них память, используя malloc.

Таким образом, хотя a находится в стеке, a._pb_arr будет в куче. Вы должны явно free память, когда вы закончите. По той же причине b находится в стеке, а pb - в куче.

Когда вы назначаете объекты в массиве a._pb_arr, значения будут скопированы, но они все равно останутся в куче, так как вы выделили память для a._pb_arr.

Чтобы предотвратить утечки памяти, вы должны использовать free для a._pb_arr и pb.

...