2

私はcプログラムでメモリがどこに割り当てられているのか理解しようとしています。cで不変の文字列に割り当てられたメモリはどこにありますか?

void func1(char e, int f, int g) 
{ 
    int b = 4; 
    char * s = "hello world"; 
    char * temp = (char *) malloc(15); 

} 

私が理解しているように、スタックb、s、tempには3つの自動変数が割り当てられています。 b(4)の内容はスタックに格納され、ポインタsとtempはスタックに格納され、tempのデータはヒープに格納されますが、格納されるデータはどこにありますか? func1呼び出しを終了してもコンテンツのメモリは永久に割り当てられているため、b、s、およびtempはなくなるためです。私の他の質問は、1バイトのcharの場合でも、関数の引数を押すときのように、スタックポインタは常に4だけシフトダウンされますか? eは1バイトだけですが、スタックはこのようになりますか?このありえない

30:// other stuff 
26: g 
22: f 
18: e 

http://www.firmcodes.com/wp-content/uploads/2014/08/memory.png Cプログラムのレイアウト?

+5

はどこでもあなたのツールチェーンは、それを入れています。アーキテクチャ、コンパイラ、リンカに依存しますが、GCCでは '.rodata'セクションに行く可能性がありますが、物理的にはどこにあるのでしょうか?上を参照してください。 –

+1

['malloc()'](http://stackoverflow.com/a/605858/1983495)の戻り値をキャストしない理由をお読みください。そして、私はあなたがスタックについて正しいと思うだけでなく、ポインタだけがあり、ポインターのための4または8のいずれかである 'char'がないことに注意してください。あなたのコードの '' hello world ''文字列の正しい用語である*文字列リテラル*は[データセグメント](https://en.wikipedia.org/wiki/Data_segment)になければなりません。それは読んでいるだけです。 –

+1

アセンブリをコンパイルして何が起こるかを確認してください。たとえばlinux/gcc/intel cpuの場合は、以下を使用してください: 'gcc -S -masm = intel program_name.c' –

答えて

0

四つの可能な貯蔵期間がある:

  • 自動(b
  • 静的("Hello world"
  • 動的(malloc(15)によって割り当てられた領域)
  • スレッド

あなたの質問であなたが尋ねる他のもの特定のコンパイラとプラットフォームのプロパティです。いくつかの設定にはスタックがなく、ヒープもなく、データセグメントや.dataセクションや.bssセクションもありません。

さらに読書:

1

プラットフォームによって異なり、実装定義です。一般に、(ご使用のシステムで利用可能な場合)はの読み取り専用メモリに移動します。続きを読むhere

あなたが指摘したように、関数が終了すると、メモリリークが発生しますが、が動的にメモリを割り当てた場合にのみ、自動変数!あなたはfunc1()は、その呼び出し元とtempを通信できるようにする必要があることを意味

(例えばmain())、あなたは後でfree()それができるように。または、機能が終了した後にその機能が必要ない場合は、機能を終了する直前にfree()を実行してください。ところで


iharobが言ったように、:、新しい質問する必要がありますあなたの他の質問、についてはDo I cast the result of malloc? NO!


thisthisを読んで、彼らは役立つかもしれません。標準Cの用語で

+0

これは完全に実装定義です。例えば。 PCには通常のコード/データ用の読み取り専用メモリはありません。 – Olaf

+0

@Olafはい、正しい。私は私の答えを更新します。 – gsamaras

関連する問題