例えばある言語で変数を定義したとします。
var i = 1;
この i をどのメモリアドレスに割り当てるかは、どのレイヤーで行っているのでしょうか。
少なくとも、OSレベルではない認識です。
なぜなら、OSはC言語で出来ていて、C言語標準の機能で変数宣言が可能だからです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
コードをコンパイル後、リンクの時にアドレスは決まります
投稿2022/03/25 22:46
総合スコア87774
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/03/25 22:51
2022/03/25 23:11 編集
2022/03/26 00:18
2022/03/26 00:42
2022/03/26 00:43
2022/03/26 07:16 編集
0
どのレイヤーで
それを言うためには、どういうレイヤーモデルを意図しているのかを知らないと...
「レイヤー」を無視して言うなら、
言語処理系は、何らかのメモリープールを持っていて、そこの中で変数のエリアを確保します。
そのメモリープールは、場合によってはシステム固定で持っているかも知れませんし(それなら変数を使うことを決めた時点でアドレスも決まるかも知れません)、OSに取得を依頼するものかもしれません(その場合具体的なアドレスはOSから貸与されたメモリアドレスに依存するかも知れません)。
OSはC言語で出来ていて、C言語標準の機能で変数宣言が可能だからです
C言語でできたプログラムはC言語の文法規則のように動くのではありません。ここは勘違いしないように...
C言語で作っていようとアセンブラで作っていようと、C言語の変数確保の仕組みとは切り離した話になります。
変数からは話が離れてしまいますが、ときどき見るC言語のソースとCで書いたプログラムの「勘違い」の例を言えば...
Cで文字列のエスケープシーケンスってありますよね。'\n'とか'\0'とか。あれは、C言語のソースコード中で文字/文字列の中に記述したときだけに有効なルールです。
あるいは、数値リテラルの先頭に0があるのは8進数、0xがあるのは16進数として解釈しますが、それもCのソースコードの中でだけ有効なルールです。
C
1char buf[256]; 2int n; 3... 4 scanf("%s",buf); 5 scanf("%d",&n); 6 printf("%s %d %d\n",buf,n,0123); 7...
に対して
abc\ndef\0ghi
0123
と入力を与えたらどういう結果になるでしょう?
「C言語の変数宣言」をそこで持ち出すのは、これが
abc
def
83
となるのを期待するようなものです。
投稿2022/03/25 23:24
編集2022/03/25 23:27総合スコア7639
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。