- ベストアンサー
C言語におけるローカル変数が使用するメモリについて
mitonekoの回答
安直な表現をしましょうか・・・。変数aが****番地にあるという事実に興味があるのは、人間とコンパイラ・リンカだけです。全てのプログラムは、最終的には、機械語というCPU固有の命令体系に変換されるのですが、この領域では、CPUは、あくまでメモリーアドレスの絶対値だけにしか興味がないのです。 逆の表現をすると、メモリーアドレス****と書いても「人間にとって」わかりにくいので、これを変数aと「人間が書くことにした」だけなんですね。 CPUさんは、逆に、数字にしか興味がありませんから、メモリーアドレス****と書いてくれないと困るわけです。 というわけで、機械語の世界では、メモリーの参照は全て、メモリーアドレスの絶対値が直接プログラムの中に書いてあるのが基本です。 スタック領域は、少々面倒で、関数やサブルーチンを呼び出すと別の領域を確保してあげる必要がでてくるので、このアドレスに関しては、まず、現在のスタックのベースとなるアドレスをスタックポインタと呼ばれる特殊なレジスタに設定することになっています。そして、この中のアドレスに関しては、このベースアドレスからどれだけ離れているか(オフセット)を指定することにより、メモリーアドレスの絶対値を求めます。つまり、オフセットがスタック内のメモリーアドレスの代わりをするわけです。そして、機械語の中では、このオフセットの値が直接書いてあります。 そして、CPUさんは、やっぱり、このオフセットの絶対値にしか興味がありません。オフセット***がaというローカル変数名でC言語に書かれていたことには全く興味がないのです。だから、紐づけをしておく必要は全くありません。 この紐づけは、正しい機械語を記述するために、コンパイラやリンカが必要とします。だから、コンパイラやリンカが扱うファイル群の中にこの紐づけを記述したファイルが実はあります。基本、バイナリ形式ですが、人間に見やすいように、クロスリファレンスとか、mapファイルとかいう形でテキスト化されたファイルを出力するようにもできることが多いです。デバッグするときに、メモリーアドレスを直接追いかける必要がでてきた時に、「人間が」参照することがあります。
関連するQ&A
- C言語の変数について
C言語の変数について教えていただきたいです。 C言語で下記のような設定をした場合、変数A、Bに設定する値にはバイト数制限 はないのでしょうか? バイト数制限がなくなる場合、なぜそうなるのかを教えていただきたいです。 よろしくお願いします。 #include <stdio.h> void test( char **B); int main( int argc, char *argv[] ) { char *A = NULL; char *B = NULL; A = argv[1]; test( B ); return 0; } void test( char **B ) { strcpy(B, "ABCD"); return 0; }
- ベストアンサー
- C・C++・C#
- 動的なメモリ領域の確保
double型変数5個分のメモリをmalloc関数により確保し,その確保した要素のアドレスを表示するように,プログラムを作る問題で、 (注)に「 %pで表示するためには,double型へのポインタ(double *)をvoid型へのポインタ(void *)にキャストする必要がある.」と書かれていたのですが、どういうことでしょうか? 以下のようでいいのでしょうか? #include<stdio.h> #include<stdlib.h> #define COUNT 5 // 動的に確保するメモリ領域数を示すマクロ定数の定義 int main(void) { // 動的に確保するメモリ領域のアドレスを保持するポインタ変数の宣言 double * pointer; int i; // for文で使用する変数の宣言 // int型変数5個分のメモリ領域を確保 pointer = (double *)malloc(sizeof(double) * COUNT); if(pointer == NULL) { // メモリ領域の確保が失敗した場合 printf("メモリ領域を確保できませんでした.\n"); exit(1); // プログラムの終了 } for(i = 0; i < COUNT; i++) printf("%d番目のアドレスは%pです.\n", i + 1, pointer + i); free(pointer); // 確保したメモリ領域の解放 return 0; }
- 締切済み
- 情報工学
- 初期化していない変数に1が入っていた [C言語]
初期化していない変数には0が代入される、という話を聞いたので確かめてみたのですが、初期化していない変数には0ではなく1が入っていました。 《ソース》 #include <stdio.h> void main(){ int i; printf("10進数:i=%d",i); } 《結果》 10進数:i=1 初期化していない変数には1が入っているのが正しいのでしょうか。 それとも処理系によって違うのでしょうか。回答よろしくお願いします。
- ベストアンサー
- C・C++・C#
- C/C++言語のメモリについて
C言語でメモリを2種類?に分けると、スタックとヒープがあります。 ヒープは mallocなどで確保し、freeで解放しますがスタックは解放する必要がありません。 そのスタックは通常、何バイトまで可能なのでしょうか? あと関数外のファイルの先頭に int[1000000];とした場合、このメモリはmallocで確保していませんが、 どこに作られるのでしょうか? 私のパソコンはメモリが2GBでWindows2000ですが、CやC++で最大、何バイトまでメモリが使えますか? また、一番多くメモリを確保できるなら、OSはなんでも構いません。 解釈等も間違っていたらご指摘していただきたいです。
- ベストアンサー
- C・C++・C#
- C言語の簡単な質問です。
#include "stdio.h" int tasizan(int a,int b){ int c; c=a+b; return c; } int main(void){ int a,b,c; a=1; b=1; c=tasizan(a,b); printf("%d+%d=%d",a,b,c); return 0; } と、あるとします。この文を読み込む順番を教えてください。 文の左に行番号みたいに順番を書き込んでください。 例 (例が間違ってたらすみません) 1 #include "stdio.h" 2 int main(void){ 3 int a,b,c; 4 a=1; 5 b=2; 6 c=a+b; 7 printf("%d+%d=%d",a,b,c); 8 return 0; }
- ベストアンサー
- C・C++・C#
- C++ の new演算子について
C++ の new演算子について質問です。 new演算子を用いてクラスのインスタンスを作ったときに、 クラスのメンバー関数内で使用される自動変数はメモリの何処に割り付けられますか? 以下の回答の内のいずれかと想定しています。 ・ヒープ領域 ・スタック領域 たとえば、以下のように、クラスTestClassが定義されていたとします。 class TestClass { int x; // int型(4byteとする) char y; // char型(1byte) long z; // long型(4byte) void play(short); } void main(void){ TestClass* pt = new a(); play(10); } void TestClass:: play(short n){ char a; long b; static c; for(int a = 0; a < 10; a++ ){ b = n * a; cout << b; } } main関数内で、インスタンスを作成した時点で ・TestClassのデータメンバx,y,z ⇒ ヒープ領域に確保(4+1+4 = 9byte。もしかしたらアライメント の関係で もう少し大きく領域を確保するかも) ・play関数で使われる変数n,a,bの領域は何処に確保されるのでしょうか? 変数cは静的変数用領域に保存される? new演算子で作ったインスタンスはdelete演算子を使わないと消えないと勉強しました。(OSが消さない限り) つまり、上記ではmain関数を抜けても、変数x,y,z,n,a,bの実体は残ると考えてよいのでしょうか? そう考えると、n,a,bの実体はスタックではなく、ヒープ領域に確保する気がします、、 どうか、ご教授ください。
- ベストアンサー
- C・C++・C#
- c言語のメモリの確保について
c言語で変数を宣言したり、領域を確保したりする場合に、メモリ上のこのアドレスに領域を確保する、といったように場所を指定することはできるのでしょうか?
- ベストアンサー
- C・C++・C#
- C言語 動的なメモリの確保 実行できない
malloc関数を使いメモリを確保しそこへ"ABCD"と記憶させ、ポインタ*Cを使い確保したメモリの内容を表示するプログラムです。 ********************************************* #include <stdio.h> #include <stdlib.h> int main(void) { int i; char *C; C = (char *) malloc (sizeof(char) * 5); C = "ABCD"; for(i = 0; i < 5; i++){ if(C[i] != NULL){ printf("%s", C[i]); ←※エラー※ } } free(C); return 0; } ********************************************* 正常にコンパイルできますが実行エラーになります。VCを使いF10のデバッグテストで※のところエラーになります。なぜなのでしょうか?
- ベストアンサー
- C・C++・C#
- C言語 動的なメモリの確保 コンパイル時エラーも警告もないのに実行できない
配列A[3]を{2, 4, 6}と初期化させ、malloc関数を使いメモリを確保しそこへ先程の配列Aの要素を記憶させ、ポインタ*Nを使い確保したメモリの要素を表示するプログラムです。 ********************************************* #include <stdio.h> #include <stdlib.h> int main(void) { int A[3] = {2, 4, 6}; int i; int *N; N = (int *) malloc (3); for(i = 0; i < 3; i++){ N[i]= A[i]; } for(i = 0; i < 3; i++){ printf("%d", N[i]); } free(N); return 0; } ********************************************* VCを使いF10のデバッグテストでは正常に動くのですが、コマンドラインからではエラー報告画面がでます。なぜなのでしょうか?
- ベストアンサー
- C・C++・C#
- C++で、メンバもヒープに確保されていますか
C++でどこまでヒープに確保されるのかが分からなくなる場合があります。 特に、配列がある場合や、クラスを使う場合newしてインスタンス作って使用する場合と、 そうでない場合があり、どこまでヒープ領域に確保されているのか 分からなくなってしまっています。 (開発環境 Visual Studio 2013等) Q1 クラス内の配列 class AA{ public: int x; int dat[10]; }; AA *a0 = new AA(); とする場合と AA a1; とする場合。 このとき、メンバ変数はそれぞれ、 a0->xはヒープ領域に確保 a1.xはスタック領域に確保 されるという理解で良いですか? そして、配列a0->dat[0]等 もヒープ領域に確保されていますか? Q2 クラス内にクラス class BB{ int u,v; AA aa; }; BB *b0 = new BB(); とした場合、 b0がヒープに確保されるとして、 b0->aaはヒープに確保されており、 b0->aa.xやb0->aa.dat[0]等もヒープに確保されているという ことで良いでしょうか? Q3 確認方法 変数等がヒープかスタック領域のどちらに確保されたかは どうやって見分けることができますか? アドレスの値から判断できますか? よろしくお願い致します。
- 締切済み
- C・C++・C#