0

配列を含む構造があります。以下のようなもの:

struct Node
{
    int a;
    char a1[25];
}obj;

main()
{
    struct Node *p = malloc(sizeof(struct Node));
    p->a=10;
}

このコードには、構造ノードを格納するためのスタックと、ポインターが指すノードを格納するためのヒープからの2つの異なるメモリセクションが割り当てられていることを知りたいpですか?

4

4 に答える 4

3

ここでは、配列のスタック割り当てはありません。の内部の配列struct Nodeは、ヒープ上の連続したブロックに格納されます。これは、 を印刷することで確認できます。これsizeof(struct Node)は、少なくとも次のようになります。

sizeof(int) + sizeof(char) * 25
于 2012-07-25T11:38:30.447 に答える
3

p自動保存期間を持つオブジェクトです。そのストレージは、ほとんどのコンパイラのスタックにあります。

これは、ストレージ期間が割り当てられた構造体オブジェクトを指します。この構造体オブジェクトのストレージは、ほとんどのコンパイラでヒープにあります。

于 2012-07-25T11:39:31.660 に答える
1

編集後:

struct Node
{
    int a;
    char a1[25];
}obj;

代わりに、私が推測するデータセクションに割り当てられます。このコードは少し変更されています

#include <stdio.h>
#include <stdlib.h>

struct Node
{
    int a;
    char a1[25];
}obj;

int global_data;

int main()
{
   // struct Node *p = malloc(sizeof(struct Node));
   // p->a=10;

    obj.a = 10;

    return 0;
}

そして、アセンブリ コードを見ると。

 .file   "ada.c"
        .comm   obj,32,32
        .comm   global_data,4,4
        .text
        .globl  main
        .type   main, @function
main:
.LFB0:
        .cfi_startproc
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq    %rsp, %rbp


global_data と obj の両方が同じ場所に割り当てられています。つまり、初期化されていないデータ セクションです。ヒープに割り当てる機会はありません。malloc() の呼び出しがないためです。

于 2012-07-25T11:57:22.227 に答える
0

構造体 (struct Node) のみを宣言していることに注意してください。

宣言するだけでは、実際にはメモリは予約されません。そのようなデータの編成が存在することをコンパイラーに通知しているだけです。

malloc を呼び出すときは、必要に応じてメモリを予約するだけです。

ここで、次のように宣言するとします。

struct Node{
 .....
}myNode;

その場合、メモリ内のスペースが実際に myNode に割り当てられます。

フォローアップの質問に答えるために、スタックにもヒープにも割り当てられません。

ヒープは、メモリ割り当てによって大きくなる可能性があります。スタックは、ローカル変数で大きくなる可能性があります。これは、サイズが変わらないグローバル varであるため、データ セグメントと呼ばれるメモリ内の固定位置に配置できます。

これは、静的変数が格納される場所でもあります。

この件についてもう少し詳しく説明すると、Windows や Linux などの OS で作業している場合、プログラムを実行する前に RAM メモリ内の場所にコピーされます。その一部はコードセグメントと呼ばれ、読み取り専用コードが配置され、一部はデータセグメントであり、この変数が配置されます。プログラムがアクセスできる残りの RAM は、ヒープとスタック用に解放されます。

OS のない組み込みシステムでは、プログラムはフラッシュから直接実行されるため、そのコード セグメントはフラッシュにプログラムされます。データセグメントは利用可能なRAM(スタックと共有)に割り当てられ、ヒープはありません(ヒープの概念を理解するには、メモリ管理モジュールが必要です)

于 2012-07-25T11:55:29.963 に答える