←検索窓の楽しみ方
  ショッピングモール  掲示板ランキング


【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板1こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.4242

static変数について
投稿者---劉(2005/07/07 19:24:42)


static変数についての質問です。
関数外でstatic宣言されている場合と関数内で宣言している場合では
扱いが違うと聞いたのですがどの様にちがうのでしょうか?
#include <stdio.h>
   static int a;    
int main(void)
{

    void test(int);
    int b;
 
    b = 111;
    printf("main 1 a=%d b=%d\n", a, b);
    a = 222;
    printf("main 2 a=%d b=%d\n", a, b);
    test(b);
    printf("main 3 a=%d b=%d\n", a, b);
    return(0);
}   
void test(int b)
{  
    int a;
 
    b = 333;
    a = 444;
    printf("test a=%d b=%d\n", a, b);  
}


上記のソースでstatic宣言した変数aを関数内に持ってきても
結果がかわりませんよね?なにが違うのでしょうか?
よろしくお願いいたします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:static変数について 4243 まきじ 2005/07/07 19:36:10


No.4243

Re:static変数について
投稿者---まきじ(2005/07/07 19:36:10)


>関数外でstatic宣言されている場合と関数内で宣言している場合では
>扱いが違うと聞いたのですがどの様にちがうのでしょうか?

関数外で宣言した場合は、別ファイルからの参照ができなくなります。
関数内で宣言した場合は、関数が終了しても、プログラムが終了するまで
値が保持されます。一回目に呼び出された時のみ、初期化します。

>上記のソースでstatic宣言した変数aを関数内に持ってきても
>結果がかわりませんよね?なにが違うのでしょうか?

main() で a を参照してるので、コンパイルエラーです。

関数外で、static int a、test() で、int a と宣言した場合は、
test() では、ローカル変数の a が参照され、main() では、
ローカル変数として、a が宣言されていないので、関数外で宣言された
a が参照される。


この投稿にコメントする

削除パスワード

No.4244

Re:static変数について
投稿者---劉(2005/07/07 20:17:38)


>関数内で宣言した場合は、関数が終了しても、プログラムが終了するまで
>値が保持されます。一回目に呼び出された時のみ、初期化します。
については理解できますが、下記の
>関数外で宣言した場合は、別ファイルからの参照ができなくなります。
「別ファイルからの参照」についてイメージが沸きません…
書き込んでも読み込む事が出来ないって意味でしょうか?


この投稿にコメントする

削除パスワード

No.4245

Re:static変数について
投稿者---まきじ(2005/07/07 21:00:04)


>「別ファイルからの参照」についてイメージが沸きません…
>書き込んでも読み込む事が出来ないって意味でしょうか?

static 指定された変数は、内部リンケージを持ち、
別ファイルから extern 指定などで参照することができない。
static 指定されていない場合は、外部リンケージを持ち、
別ファイルから参照したい場合は、extern 指定する事により参照できる。


この投稿にコメントする

削除パスワード

No.4246

Re:static変数について
投稿者---まきじ(2005/07/07 21:12:09)


//hoge.c
#include<stdio.h>

void func(void);

static int x = 5; //内部リンケージを持つ
int y = 10; //外部リンケージを持つ

int main(void){

    printf("main:x = %d\n",x);
    printf("main:y = %d\n",y);
    func();
    
    return 0;
}

//foo.c
#include<stdio.h>

extern int x; //リンカーのエラーになる。
extern int y; //hoge.c の y を参照

void func(void){

    printf("func:x = %d",x); 
    printf("func:y = %d\n",y);
    
}



この投稿にコメントする

削除パスワード

No.4247

Re:static変数について
投稿者---劉(2005/07/07 23:22:29)


なるほど!やっと違いが理解出来ました!
丁寧に教えていただきありがとうございましたm(_ _)m


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity