C存储变量中的高级内存管理

时间:2019-01-30 02:16:28

标签: c memory-management struct heap-memory stack-memory

我有一个代码示例,将变量存储在内存的不同位置:全局,动态堆,堆栈和未定义。

我知道所有方法都存储在堆栈上,所有动态分配的内存都在堆中,所有不在{}块中的变量都存储在全局区域中。

我认为结构中的变量也可以以结构的大小来指向动态堆。

所以我对代码有疑问

行号(11)&(a1)存储在哪里?

a1存储在哪里?

行号(12)a1.arr存储在哪里?

行号(21)a2-> arr存储在哪里?

已存储行号(22)和(a2->大小)?

That my code example

#define N 4

typedef struct a 
{
    int* arr;
    int size;
}A;
int arr1[] = {1,2,3,4};

int main()
{ 
    A a1;
    a1.arr = arr1;
    a1.size = sizeof(arr1)/sizeof(arr1[0]);     
    A* a2;
    a2 = malloc(sizeof(A));
    int arr2[N];
    for(int i=0;i<N; ++i)
    {
        arr2[i] = i*N;
    }

    a2->arr=arr2;
    a2->size=N;
    return 0;

}

1 个答案:

答案 0 :(得分:1)

回答您的问题:

  

行号(12)&(a1)存储在哪里? a1存储在哪里?

a1存储在堆栈中。 &(a1)是一个地址。

  

行号(13)a1.arr存储在哪里?

堆栈,a1.arr专门存储在堆栈中。指针本身就是一个变量,可以存储另一个地址。如果指针的 value 被更改,则指针仍将保留在堆栈上,但是指向的指针可能在不同的上下文中。

  

行号(21)a2-> arr存储在哪里?

a2-> arr具体存储在堆中。 a2是指向堆内存的指针(因此您通过malloc对其进行了调用),但是a2仍在堆栈中。

  

已存储行号(22)和(a2->大小)?

您是指a2->尺寸吗? a2->大小存储在堆中。