• 締切済み

素朴な疑問

つまらない質問ですが int i; printf("%d",i); のように値を代入しないで実行するといつもへんな数が出てきます。 このときメモリの領域には何が格納されているんでしょうか?値を宣言しただけでもう領域にはなにかが書き込まれているということでしょうか?

みんなの回答

  • g_zero
  • ベストアンサー率37% (26/70)
回答No.2

int i; は、値を格納するメモリ上の「場所」を確保しているだけです。 その際中身は見ていません。つまり初期化は行っていないわけです。 なので中身は何が入っているか不明。結果、変な値が出力されます。 他の言語では宣言と同時に初期化されることは多いのですが、Cはそのようなことはありませんので注意が必要です。

szatmari
質問者

お礼

回答ありがとうございます。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

当該変数のために割り当てた領域に、たまたま入っていた値を出力します。 当該変数が関数内の自動変数である場合、初期値がゼロであることを期待してはいけません。

szatmari
質問者

お礼

回答ありがとうございます。たまたまって何がその値をきめるんでしょうね。

関連するQ&A

  • C++ ポインタ 認識はこれでただしいですか?

    int i=3;// iが格納されてるアドレスは001とする そこに3の値 int *pi;// piが格納されているアドレスは//002とする pi=&i;// アドレス002にある値に001が入る printf("%p",pi);//001が表示 printf("%d",*pi);//アドレス001を参照して3を表示 printf("%p",&pi);//002が表示 Q1 このイメージであってますか? Q2 *pi= の右辺は&i,iなどいれられない   代入するときは宣言以外のときは   pi=&i のようにpi= という形にして右辺はアドレスをいれ なければならない。  これであってますか? Q3 char *pc; pc="ABCDE";//ABCDEは文字定数領域に記憶される //文字Aがアドレス(仮)005、Bが006にはいっていたとしたら ↑の式はpc=005;という意味でアドレスを代入している これでいいでしょうか?

  • 構造体配列のメモリ確保

    以下のようなプログラムを作りました。 make_mem関数のなかで構造体のメモリを確保し、 データを代入しています。 しかし、mainに返ってくると値が代入されていません。 よく調べてみると、mainで宣言してあるdataのアドレスが 変更されていません。 どのようにすれば、meake_memoのなかでメモリ確保し、 データを代入できるのでしょうか? 教えてください。 実際の使用しているプログラムはmake_memoのなかで DBを開き、そのデータを配列に代入しているので、 main関数の中では配列の大きさがわかりません。 #include <stdio.h> typedef struct { int a; int b; }DATA; int make_mem(DATA *data){ int i; data=(DATA *)calloc(10,sizeof(DATA)); printf("calloc %p\n",data); for (i=0;i<10;i++){ data[i].a = i; printf("data[%d].a = %d\n",i,data[i].a); } return 0; } int main(int argc,char *argv[]){ DATA *data; int i; printf("before %p\n",data); make_mem(data); printf("after %p\n",data); for (i=0;i<10;i++){ printf("data[%d].a = %d\n",i,data[i].a); } return 0; }

  • 動的なメモリ領域の確保

    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; }

  • ポインタと {   } の関係とは

    戻り値が配列(ポインタ)で返す関数を二つ作りif文で選択できるようにしたら 各要素の値がうまく表示されません。 最初に配列の各要素に自分で値を代入するか、ランダムに値を代入させるか決めて、代入させた配列を最後に表示させたいわけです。 #include <stdio.h> int RegistData(int *); int RandomData(int *, int); void main(){ int mous[6]; int select; printf("自分で表示入力するときは1を、コンピュータに任せるときは0を入力してください。"); scanf(" %d", &select); if(select == 0){  *mous = RandomData(mous); }else if(select == 1){ *mous = RegistData(mous); } for( i = 0 ; i < 6 ; i++) printf("%d ", mous[i]); } printf("\n"); } RandomData(int *mous) { //rand()関数でランダムに各要素に値を代入する処理をします。 return *mous; } RegistData(int *mous) { //自分で要素に値を代入する処理をします。 return *mous; } ちなみに、あらかじめ要素に値を入れておくと正常にうごきます。 int mous[6] = { 10, 15, 12, 23, 33, 42};//動作確認用表示

  • 構造体のコピーについて

    次のプログラムを実行してoriginalは偶数、copyは奇数を表示するようにしたいのですが、実行すると両方とも奇数になってしまいます。 正しく表示されるようにするにはどこを直せばいいのか教えてください。 #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct structSample_ { unsigned int nmemb; /*配列の要素数 */ int *data; /* データを格納する配列 */ }Sample; /* 関数のプロトタイプ宣言 */ Sample *alloc_str ( unsigned int nmenb ); /* 新しい構造体を確保 */ /* main関数 */ int main ( void ) { Sample *original_str, *copy_str; unsigned int number = 10; int i; /* 構造体用のメモリ割り当て */ original_str = alloc_str ( number ); copy_str = original_str; /* original にデータを代入 */ for( i = 0; i < original_str->nmemb; i++ ) original_str -> data[i] = (i+1) * 2; /* 偶数を代入 */ /* original を copy に複製 */ copy_str = original_str; /* copy のデータを編集 */ for( i = 0; i < copy_str->nmemb; i++ ) copy_str->data[i]--; /* 奇数にする */ /* 結果の確認 * original には偶数が入っているはず */ printf( "original: " ); for( i = 0; i < original_str->nmemb; i++ ) printf( "%d ", original_str->data[i] ); printf( "\n" ); /* copy には奇数がはいっているはず */ printf( " copy : " ); for( i = 0; i < copy_str->nmemb; i++ ) printf( "%d ", copy_str->data[i] ); printf( "\n" ); return 0; }

  • C言語でのプログラミング

    C言語でのプログラミング プログラミングの勉強中で少し疑問が出てきたので、教えていただけるとありがたいです。 1から10までの数を足していくという次のプログラミングについてです。 #include <stdio.h> void main(void) {    int a = 0, i;    for (i=1; i<=10; i++) {      a = a + i;    }    printf("1から10の合計は%dです¥n", a); } 変数として、aとiを定め、aには0が代入されています。 つぎにforループが発動する際に、iに1が代入されiが10以下であるため、a = a + iが実行されます。 このとき、右辺が先に実行されa = 1となるはずです。 ここで疑問なのですが、aには1だけ入っているのでしょうか? それとも0と1が入っているのでしょうか? そしてa = a + iが実行されたのち、i++によりiには2も入ることになると思います。 ここでも同じ疑問として、iには1と2が入っているのか? それとも2だけが入っているのか良く分かりません。 もし仮にaにもiにも数字がどんどん格納されていくのなら、なぜ足し算の式において一つの値だけを取り出して足し算を実行できるのか分かりません。 長くなりましたが、ご解答よろしくお願いします。

  • ポインタのsizeofについて

    C初心者です。 ポインタ宣言させた変数をsizeof()で値を取得させて 表示させてみました。 char *cp; short int *sp; int *ip; i = sizeof(cp); printf("%d\n",i); i = sizeof(sp); printf("%d\n",i); i = sizeof(ip); printf("%d\n",i); 結果は全て4となりました。 これはなぜですか? (ただの変数として宣言すれば1、2、4となります。この理由も理解できています。)

  • C言語の問題でわからないところがあります

    先ほども似たような内容で質問させて頂いたのですが、もう一度質問させてください。 最近C言語を勉強し始めたのですが、わからないところがあります。 二つの整数値を読み込んで、小さい方の数以上で大きい方の数以下の整数を全て加えた値を表示するプログラムを作成するものなのですが、うまくいかなく困っています。 他の書き方でやれば普通にいけると思うのですが、これだとできない理由がわからないと、もやもやしてしまうので・・・・ プログラムは以下の通りです #include <stdio.h> int main(void) { int n1,n2,n3,n4; puts("二つの整数を入力してください"); printf("整数1:"); scanf("%d",&n1); printf("整数2:"); scanf("%d",&n2); n3=(n1>n2) ? n2 : n1; n4=(n1>n2) ? n1 : n2; printf("%d以上%d以下の全整数の和は", n3,n4); int num=n3; /* numの最初の値は小さい方の値 */ int wa=0; /* n3が小さい方の数、n4は大きい方の数 */ do{ if (n1>n2) { wa=n4+num; /* 大きいほうの数(num)にsub(小さい方の数+0,2,3,4・・・)を足していく */ num=num+1;/* ここを通るたびにsubに+1 */ printf("%d",wa);} else { wa=n4+num; num=num+1; printf("%d",wa);} }while(num<n4); /* num<n4を満たさない=numが大きいほうの数よりも大きくなったらループを終了 */ printf ("です\n"); /* ですっす */ return 0; } これで大きい方に37、小さいほうに28と入力すると656667686970717273ととても大きな数値になってしまいます。 ループが間違っているのでしょうか? whileは whileの後の()の中身の条件を満たしているとにループする、と認識しているので、numが大きい方の数値より大きくなったとき、ループを終了するようにしているつもりです。 ここがどこか間違っているのでしょうか・・・? それから、初期化というのもいまいち理解していないのですが、intで宣言するときに、中に数値を格納しておく、という物だと思っています。 宣言の後にprintf("%d",num);などで確認すると、代入できているようなので、これは間違っていないと思うのですが・・・・、 間違っているところがざっとみて解りましたら、回答頂けるとありがたいです。 C言語を始めたばかりなので、できれば簡単に説明して頂けるとありがたいです。

  • 配列の疑問。

    もうすぐC言語のテストがあるので適当に自分で問題を作って プログラムを作る練習をしていたのですが配列の所でちょっと疑問に思いました。 問題 ひとつずつ数字を入力していき、それまでの数字の合計と平均を求めるプログラム。 0を入力するとプログラム終了(配列、ポインタ、関数を用いること) #include <stdio.h>    int wa(int *a,int b); main() {    int a[10],ans,i=0,c;    double ave=0,j;    while(1)    {      scanf("%d",&a[i]);      c=a[i];      i++;      if(c==0){         exit(1);      }      ans=wa(&a[0],i);      printf("合計%d\n",ans);      j=i;      ans=wa(&a[0],i);      ave=ans/j;      printf("平均%lf\n",ave);      printf("計算回数%d回\n",i);    } } int wa(int *a,int b) {    int ans=0,i;    for(i=0;i<b;i++){      ans+=*(a+i);    }    return ans; } このようなプログラムで一応自分の期待通りには動いてくれたのですが、 こういう「0」を入力しない限り終わらないプログラムのときに配列を利用すると どれぐらい領域を取っておくかがわからないんですよ。 今回はa[10]としてますが、結局10しか確保してないから10回しか入力できないかな? っと思って実行してみますが普通に10回以上でもエラーがでることもなく実行できるんですよね。 これはなぜでしょうか? 私の配列の考え方がまちがっているのでしょうか?

  • webでプログラミング repl.itの利用

    Web上でC++の実行をしようとrepl.itを使いました。 しかし、C++でプログラミングを実行しようとしても exited with non-zero status というエラーが出てしまいます。 これの解決方法をお願いします。 また、単にソースがおかしいことも考えられるので載せます。 #include <stdio.h> #include <math.h> int main(){ int x,y,i; printf("xに代入する値を決めてください。x="); scanf("%d",x); for(i=0;i<x;i++){ y=y+2; } printf("y=%dです。",y); return 0; }

専門家に質問してみよう