私はなぜ関数の外から関数内で宣言された変数にアクセスできないのか知りたいですか?技術的には、グローバル/静的変数のように.dataセグメントを入れたので、それらにアクセスすることは技術的に可能です。また、グローバル変数と静的グローバル変数の違いは何ですか?関数内で宣言された静的変数にアクセスしています
int global_n =1;
static int global_static_n=2;
int main(){
int local_n=3;
static int local_static_n=4;
return 0;
}
void test(){
global_n=9;
global_static_n=8;
//local_n=7;
//local_static_n=6;
}
私はコンパイルして、次のGCC
コマンドでそれをリンク:
objdump -w -j .text -D -Mi386,addr32,data32,intel main.o
objdump -w -s -j .data main.o
:以下objdumpのコマンドによって、私はそれを逆アセンブル
gcc -Wall -m32 -nostdlib main.c -o main.o
は、私は次のよう
C
のファイルを持っています
次のダンプを取得してください:
Disassembly of section .text:
080480f8 <main>:
80480f8: 55 push ebp
80480f9: 89 e5 mov ebp,esp
80480fb: 83 ec 10 sub esp,0x10
80480fe: c7 45 fc 03 00 00 00 mov DWORD PTR [ebp-0x4],0x3
8048105: b8 00 00 00 00 mov eax,0x0
804810a: c9 leave
804810b: c3 ret
0804810c <test>:
804810c: 55 push ebp
804810d: 89 e5 mov ebp,esp
804810f: c7 05 00 a0 04 08 09 00 00 00 mov DWORD PTR ds:0x804a000,0x9
8048119: c7 05 04 a0 04 08 08 00 00 00 mov DWORD PTR ds:0x804a004,0x8
8048123: 90 nop
8048124: 5d pop ebp
8048125: c3
Contents of section .data:
804a000 01000000 020000000400万
私はlocal_static_n
がちょうどglobal_static_n
とglobal_n
よう.dataのセグメントに入れていることがわかります。次の行のコメントを外すと、エラーが表示されます。
local_n=7;
local_static_n=6;
error: ‘local_n’ undeclared (first use in this function)
error: ‘local_static_n’ undeclared (first use in this function)
これらは宣言されている関数にスコープが設定されているため、生成されたアセンブリとは何の関係もありません。言語標準ではどのように定義されていますか?[参照先ページ(http:// en .cppreference.com/w/c/language/scope):* "Cプログラムに現れる各識別子は、スコープと呼ばれるソースコードの不連続な部分だけに見える(つまり使用される) – UnholySheep