ポインタのポインタの学習中にエラーが発生しています

このQ&Aのポイント
  • C言語の「ポインタのポインタ」の学習中にエラーが発生しています。具体的には、if文の部分でエラーが起きているようですが、どのようなエラーなのかわかりません。
  • プログラムの中で、**ppdate = NULLというif文がありますが、このif文が正しく動作していないようです。**ppdateに値が与えられていない場合にメッセージを表示する処理ですが、正しく動作していないようです。
  • また、ppdate = &pdateの部分でppdateにpdateのアドレスが代入されています。そして、**ppdate == 300というif文で、ppdateが指す値が300と等しい場合にメッセージを表示する処理が行われています。
回答を見る
  • ベストアンサー

ポインタのポインタ

こんにちは。 C言語の「ポインタのポインタ」の学習中なのですが、以下のプラグラムがエラーが出てしまします。 if文が間違っていると思うのですが、具体的に何がどう間違っているのがわかりません。 ご教示お願いいたします! #include<stdio.h> int main(void) { int date = 300; int *pdate = NULL; int **ppdate = NULL; printf("dateの値は%d<\n", date); pdate = &date; printf("*pdateの値は%d<\n", *pdate); if(**ppdate = NULL){ printf("**ppdateには何も与えられていません。\n"); } else{ return 0; } ppdate = &pdate; if(**ppdate == 300){ printf("**ppdateの値は%dになりました。正常です。\n", **ppdate); } /*強制終了を避けるためのプログラム*/ int i; scanf("%d", &i); return 0; }

質問者が選んだベストアンサー

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

>if(**ppdate = NULL){ 代入になっているのはおかしい。 というのは既に指摘されてますが…。 NULLポインタアクセスになってませんかね? *は不要かと思いますが。

その他の回答 (4)

  • wormhole
  • ベストアンサー率28% (1619/5652)
回答No.5

もう回答がつてしまってますけど、 >C言語の「ポインタのポインタ」の学習中なのですが、以下のプラグラムがエラーが出てしまします。 「エラーが出てしまいます。」では他の人にはどういったエラーが出ているのかわかりません。 どういったエラーなのか他の人にわかるように説明しましょう。 また「ポインタのポインタ」の学習中と書かれていますが、まずはポインタをしっかり理解しましょう。 ポインタをしっかり理解してるなら「ポインタのポインタ」の学習なんて不要です。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.4

#3です。 int **ppdate = NULL; のとき、 NULLが設定されるのは、ppdateです。 **ppdateにNULLが設定されるわけではありません。 int** ppdate= NULL; int** 型のppdateがあり、 ppdateにNULLが設定される。 と考えてください。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

if(**ppdate = NULL){ printf("**ppdateには何も与えられていません。\n"); } を if(ppdate == NULL){ printf("ppdateには何も与えられていません。\n"); } に替えてください。

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.1

if(**ppdate = NULL){ if(**ppdate == NULL){

関連するQ&A

  • ポインタに ~0を入れること

    見かけたCのプログラムで、 ポインタに~0を代入するものを見ました。 そのプログラムをそのまま載せるのはわかりにくいので、 代わりに以下のプログラムを作って実行しました。 #include <stdio.h> int main(void) { char *pa[3]; int i; pa[0]=0; pa[1]=~0; pa[2]="Hello"; printf("sizeof(char*)=%d\n", sizeof(char*)); for(i=0; i<=2; i++) { if(pa[i]==NULL) printf("pa[%d] はNULLです。\n", i); if(pa[i]==(char*)0xFFFFFFFF) printf("pa[%d]は全ビット1です。\n", i); if(pa[i]==~0) printf("pa[%d]は~0です。\n", i); } return 0; } 結果 sizeof(char*)=4 pa[0] はNULLです。 pa[1]は全ビット1です。 pa[1]は~0です。 このプログラムはコンパイル時にエラーも警告も出ず、 動作も意図したとおりです。 pa[1]に入っている ~0 は、int型の定数なのでしょうか。 それならば、 pa[1]=~0; という代入や if(pa[i]==~0) という比較は 左辺はchar*型で右辺はconst int型であって型が異なりますが、 問題ないのでしょうか。 ~0は0の否定なので、全ビットは1なのでしょうけど、 int型(の定数)だと思います。 ~0というのは何か特別な値なのでしょうか。 ポインタに~0を入れるというのは、意味があるのでしょうか。 (例えば、「ポインタに0を入れるということは、ヌルポインタであって、ポインタとして無効なんですよ」のようなこと。)

  • ポインタのポインタ

    #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char **argv){ int i; if(argc != 2) { fprintf(stderr, "Usage: %s vector\n\tEx: %s 11110000\n", argv[0], argv[0]); return 1; } for(i=0;i<8;i++){ if(**argv == '0'){ printf("%d\n",i); } else{ printf("A%d\n",i); } argv++; } return 0; } コンパイルして./a.exe 10010011などと入力しても A0 A1 Segmentation Faultとなります。 どうすれば、 A1 0 ・・・省略 for文で回した8回分、出力が可能になるのか教えてください。 初歩的な質問ですいません。

  • C言語のIF関数のアドバイスお願いします。

    #include <stdio.h> int main(){ int x,i,div=0; printf("x="); scanf("%d",&x); for(i=1;i<=x;i++){ if(x%i == 0){ div++; } } if(ここがわかりません) printf("%dは素数です\n",x); else printf("%dは素数でありません\n",x); return 0; }

  • ポインタと配列

    次のソースで、結果表示でポインタを使いたいのですが、うまくいきません。1件しか表示されないのです。 ポインタの扱いがおかしいのだと思いますが、どうしたらよいでしょうか? #include <stdio.h> #include <string.h> int search(char key[256],FILE *fp,char *result[256][256]); main(void) { FILE *fp; int rep,n,i; char x[256],key[256],*result[256][256]; printf("検索キーワードを入力してください。\n" "キーワード>"); gets(key); if((fp=fopen("personal.txt","r"))==NULL) { printf("ファイルをオープンできません\n"); exit(1); } printf("=====検索結果=====\n"); n=search(key,fp,result); for(i=0;i<n;i++) { printf("%s\n",result[i]); } printf("検索結果:%d件です。\n",n); fclose(fp); } int search(char key[256],FILE *fp,char *result[256][256]) { int n=0; char *p,word[256],*name; while((p=fgets(word,256,fp))!=NULL) { if(strstr(word,key)!=NULL) { name=strtok(p," "); strcpy(result[n],name); n++; } } return n; } 実行すると、下の警告がでます。 illegal pointer combination(param)

  • ポインタエラー?

    コンパイルエラーで、つまづいてます 型が合ってないというのはわかるのですが どうしたらいいのかわかりません どこを改善すればいいでしょうか 問題とソースです↓ ソースは色々てを加えたので変なものが混じってます。 関数ichi()を作成し、プログラムを完成させよ。 main内部を変更してはならない。 (見つからない場合も考慮されている事に注意せよ。) #include <stdio.h> #define MAX 10 int *ichi(int *,int); int main() { int x[MAX], i, n, *p; for (i = 0; i < MAX; ++i) { scanf("%d", &x[i]); } scanf("%d", &n); p = ichi(x, n); if (p) { printf("%d ha %d ko me ni arimashita\n", n, p-x); } else { printf("%d ha arimasen desita\n", n); } return 0; } int *cnt; int * ichi(int *x,int n) { //int cnt; //cnt = 0; while(*x){ if(*x == n){ cnt = &n; //cnt = x; //return x; return cnt; } *x++; } return NULL; }

  • ポインタいついて教えてください

    ポインタがわかりません。 教えてください。 下の二つは、共に「100」を表記すると思いますが、 どこがどのように違うのですか。 また、f1()という関数をつくって、ここで scanfを使って、5つぐらい値を代入させて、 他の関数でこの値を使おうと思っています。 この場合下のどちらを使うのが、よろしいのでしょうか。 よろしくお願いします #include <stdio.h> int main(void) { int *p, q; q = 100; /* q に100を代入 */ p = &q; /* p にq のアドレスを割り当てる */ printf("%d", *p); return 0; } #include <stdio.h> int main(void) { int *p, q; p = &q; /* q のアドレスを得る */ *p = 100; /* ポインタを使ってq に値を代入する */ printf("%d", q); return 0; }

  • ポインタお手上げです。

    #include <stdio.h> main() { void original(int[], int *[], int *[], int *[]) ; int i, origin[10]; int m2[10],m3[10],m5[10]; for(i = 0; i < 10; i++){ scanf("%d", &origin[i]); } original(origin, &m2[], &m3[], &m5[]); printf("2の倍数:"); for(i = 0; i < 10; i++){ printf("%2d ,", m2[i]); } printf("\n"); printf("3の倍数:"); for(i = 0; i < 10; i++){ printf("%2d ,", m3[i]); } printf("\n"); printf("5の倍数:"); for(i = 0; i < 10; i++){ printf("%2d ,", m5[i]); } printf("\n"); return 0; } void original(int origin[], int *multiple_2[], int *multiple_3[], int *multiple_5[]) { int i, m2 = 0, m3 = 0, m5 = 0; for(i = 0; i < 10; i++){ if(origin[i] % 2 == 0){ *multiple_2[m2] = origin[i]; m2++; } if(origin[i] % 3 == 0){ *multiple_3[m3] = origin[i]; m3++; } if(origin[i] % 5 == 0){ *multiple_5[m5] = origin[i]; m5++; } } } 上のプログラムをコンパイルし実行するとセグメントエラーがでてしまいます。どこがわるいんでしょうか・・・。上のプログラムは、外部入力から10個の数字をoriginに格納しそれをそれぞれ2の倍数、3の倍数、5の倍数をあらわすポインタにそれぞれを格納していき、最後にそれを表示するプログラムなんですが・・・。いまいち配列を持ったポインタを使い、なおかつ引数として使うやり方がうまくわからないからこんなエラーが出るような気もします・・・。どなたか初心者でもわかるようなアドバイスお願いします!

  • 解説お願いします。

    0から9までの数字を入力しあたりかはずれかを表示するプログラム。 #include<stdio.h> #include<time.h> #include<stdlib.h> int main(void){ int r,a; printf("0から9までの数字を入力してください。\n"); scanf("%d",&a); srandom(time(NULL)); r = random()%10; printf("%d \n",r); if(a==r){ printf("アタリ\n");} else{ printf("ハズレ\n");} return 0; } 例えば%10は何のためにあるのかとか・・

  • ポインタ配列

    配列をポインタでとって、配列要素を足していこうと思ったのですが、 #include <stdio.h> int main (void) { int p[11]={11,23,43,66,54,67,51,88,22,43,-1}; int *e=p; int x=0; int i=0; while( *e!=-1 ) { x + = ( * (e+i) ); i++; } printf("%d\n",x); return 0; } x = ( * ( e+i ) ); ↑この部分がなぜだめなのか理解できません どなたか教えてくださるとありがたいです

  • 関数とポインタ

    整数Mを素因数分解して、その素因数を*primeに入れておきたいんですが、mainの方で呼び出すと違う値になってしまいます。。 同じ値になるようにしたいのですが…どなたかお願いします(>_<) #include<stdio.h> #include<stdlib.h> #define MAX 256 int prime_fac(int M, int* prime) { int i, n; i = 1; n = 2; while(M != 1){ while(M % n == 0){ *(prime+i) = n; printf("%d\n", *(prime+i)); M = M / n; i++; } n++; } return i; /*素因数の個数(重複あり)*/ } int main(){ int M; int *prime; prime = (int *)malloc(sizeof(int) * MAX); printf("M: "); scanf("%d", &M); prime_fac(M, prime); printf("%d\n", *prime); printf("%d\n", *prime+1); free(prime); return 0; }

専門家に質問してみよう