私は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プログラムのレイアウト?
はどこでもあなたのツールチェーンは、それを入れています。アーキテクチャ、コンパイラ、リンカに依存しますが、GCCでは '.rodata'セクションに行く可能性がありますが、物理的にはどこにあるのでしょうか?上を参照してください。 –
['malloc()'](http://stackoverflow.com/a/605858/1983495)の戻り値をキャストしない理由をお読みください。そして、私はあなたがスタックについて正しいと思うだけでなく、ポインタだけがあり、ポインターのための4または8のいずれかである 'char'がないことに注意してください。あなたのコードの '' hello world ''文字列の正しい用語である*文字列リテラル*は[データセグメント](https://en.wikipedia.org/wiki/Data_segment)になければなりません。それは読んでいるだけです。 –
アセンブリをコンパイルして何が起こるかを確認してください。たとえばlinux/gcc/intel cpuの場合は、以下を使用してください: 'gcc -S -masm = intel program_name.c' –