• ベストアンサー

警告をださずにポインタにnullを渡す方法は?

こんにちは。 ポインタ型の引数にNULLを渡してやりたいのですが 以下のような警告がでてしまいます。 test.c: In function 'test_': test.c:14: 警告: passing argument 2 of 'test' makes pointer from integer without a cast 問題の箇所は以下のように書いてます。 【test.c】 ~省略~ /** プロトタイプ **/ 7 void aaa(int,int*,int*); ~省略~ 14 aaa(0,NULL,&tv); NULLを渡したい場合、警告をださないように スマートに記述するにはどうしたらいいでしょうか? よろしくお願いします。

  • hor
  • お礼率39% (9/23)

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

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

もともとの警告に立ち返ります。 >test.c:14: 警告: passing argument 2 of 'test' makes pointer from integer without a cast これは、本来は整数型を求めているところに、 キャスト無しのポインタを渡している、ということです。 aaa関数の第二引数の型はint *とのことでしたが、正しいですか? やはり、#2さんが書かれたとおり、ソース全体を見せてくださるのがよいと思います。

hor
質問者

お礼

質問に書いたのは実際のソースではなく、簡略したものでした。 ご指摘頂いてからソース全体を見て確認したところ、 大変恥ずかしい見落としがありました。 short NULL; これです・・・・。 警告でて当然ですよね・・・。 ご回答ありがとうございました。

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

なんというか, プログラム全体を見た方が早い気がする. あるいは, その警告が出るような「なるべく簡単」なプログラムでもいい. あと, コンパイラや OS の情報 (バージョンなど) もついでに.

回答No.1

警告文は「引数の型が違う」と警告しているので、NULLの定義にもよるけどキャストしてやるだけでは? aaa( 0, (int *)NULL, &tv );

hor
質問者

補足

回答ありがとうございます! 早速試してみましたが・・・ 警告: passing argument 2 of 'aaa' from incompatible pointer type がでちゃって駄目でした。

関連するQ&A

  • C言語のバグの警告文について

    こんばんわ。 C++でプログラムを作成中なのですが警告文の意味がわからないので教えていただきたいです。 警告文 SAMPLE.c: 181 : warning: passing argument 4 of fwrite' makes pointer from integer without a cast /usr/include/stdio.h:688: note: expected 'struct FILE * __restrict__' but argument is of type 'int' どうぞよろしくお願いいたします。

  • C言語のポインターに関する警告

    line[100]で 「1」が格納されていたら「a」 「2」が格納されていたら「b」 「3」が格納されていたら「c」 とout[100]に代入する関数を作りたいのですが コンパイルすると関数の部分で warning: assignment makes integer from pointer without a cast という警告がでます。 ポインターは使っていないのですが、ポインターに関する警告が出ているようで困っています。 どこが悪いのかまったくわからなくて作業が完全に止まってしまいました。 解決法をおしえてください。お願いします。 /*宣言*/ int=i; /*main関数内のfor文で使用*/ char line[100], out[100]; void change(int); /*関数*/ void change(int i)   {    if(line[i]=='1'){     out[10]="a\0"    }if(line[i]=='2'){     out[10]="b\0";    }if(line[i]=='3'){     out[10]="c\0" } }

  • ポインタのキャスト方法

    こんにちは。 C言語でポインタキャストしているところがどうしてもうまくいきません。 以下のような要素数10個の型配列を指すポインタを キャストしたいのですがこれだと警告文がでてしまうので きちんとキャストしたいのですが、 どうしてもうまくいきませんでした。。。 1 short int *ibuf; 2 short int (*ibuf_tmp)[10]; 3 ibuf_tmp=ibuf; ※←ここです 宜しくお願いします。

  • Qpopperをインストールできません

    CentOS6.0にqpopper4.0.13をインストールしようとしたのですが、 makeにて下記のようなエラーが出力されます。 どなたかご存知でしたら、ご教授頂けないでしょうか? ---------------- popper.c: In function ‘qpopper’: popper.c:153: error: conflicting types for ‘getline’ /usr/include/stdio.h:673: note: previous declaration of ‘getline’ was here popper.c: In function ‘tgetline’: popper.c:617: 警告: passing argument 1 of ‘getline’ from incompatible pointer type /usr/include/stdio.h:673: note: expected ‘char ** __restrict__’ but argument is of type ‘char *’ popper.c:617: 警告: passing argument 2 of ‘getline’ makes pointer from integer without a cast /usr/include/stdio.h:673: note: expected ‘size_t * __restrict__’ but argument is of type ‘int’ popper.c:617: 警告: passing argument 3 of ‘getline’ from incompatible pointer type /usr/include/stdio.h:673: note: expected ‘struct FILE * __restrict__’ but argument is of type ‘struct POP *’ popper.c:617: 警告: assignment makes pointer from integer without a cast make[1]: *** [popper.o] エラー 1 make[1]: ディレクトリ `/usr/local/src/qpopper4.0.13/popper' から出ます make: *** [popper_server] エラー 2 ------------------- ここにいたるまでの手順です↓ /usr/sbin/useradd -s /dev/null -d /dev/null pop cd /usr/local/src/ tar -xzf qpopper4.0.13.tar.gz cd qpopper4.0.13 ./configure --enable-apop=/etc/pop.auth =--with-popuid=pop make

  • NULLポインタは0と書かなければだめ?

    C++言語を使っています。 C++言語でNULLポインタを表す場合、0やNULLを使用しますが、 「NULLは単なるマクロなので本来は0を使わなければだめ」という話を聞きました。 つまり、 int *p = 0; が本当の正しいNULLポインタであり、 int *p = NULL; は推奨されていない(?)NULLポインタというようです。 今まであまり疑うことなく、NULLポインタを表すのにNULLを使用していましたが、 上記の内容は本当でしょうか。

  • printf()関数の括弧を二重にして、printf((~~~))とし

    printf()関数の括弧を二重にして、printf((~~~))として コンパイル/実行すると、実行時セグメンテーション違反が発生します。 コンパイル時には警告も発生しますが、このセグメンテーション違反が なぜ起こるのか理由がよくわかりません。ご回答いただけるとありがたいです。 以下、サンプルコードと実行例です。よろしくお願いいたします。 ---mytest.c---- 1 #include <stdio.h> 2 3 int main(void){ 4 5 //printf("test:%d", 1)ではもちろんコンパイル/実行に成功する。 6 printf(("test:%d", 1)); 7 return 0; 8 } 【コンパイル/実行結果/gccバージョン】 #gcc main.c main.c:6:警告:passing argument 1 of printf makes pointer from integer without a cast #./a.out セグメンテーション違反です # gcc --version gcc (GCC) 4.1.2 20070925 (Red Hat 4.1.2-27) ・ ・

  • ポインタ型の関数のコンパイル

    Cについて勉強中の一回生です 今回初めてポインタ型の関数を作ったのですが コンパイルができません エラー内容は warning: assignment makes pointer from integer without a cast warning: assignment makes pointer from integer without a cast でした。 型があってないっぽいのですがどうしてできないのですか? struct node { int key; struct node *parent,*left,*right; }; struct node *memvber_recursive(int key,struct node *root){ struct node *x; if(root->key == 0){ printf("ありません\n",root->key); return NULL; } else if(root->key == key) printf("あります\n",root->key); else if(root->key > key) x = member_recursive(key,root->left); else x = member_recursive(key,root->right); return x; } 課題の内容は再帰を使った二分木の探索です 引数は、探索する要素の値(キー)と2分探索木の根のポインタ 戻り値は要素が見つかればその点を示すポインタを、見つからなければNULLを返します あと関数の前にアスタリスクがつく意味がわかりません ポインタを返すと言う意味ですか? 先生が例文として与えてくれたのですが こんな形は教科書にのっておらず困っています よかったら教えて下さい 宜しくお願いします。

  • 画像の処理について

    『ppm形式の画像の読み込み』のプログラムを実行したのですが、 エラーがでてうまくいきません。 どこを修正しなければいけないのか、教えてください。 エラーの内容↓ function 'main': main.c:17: 警告: passing argument 1 of 'fopen' makes pointer from integer without a cast main.c: In function 'headerScan': main.c:35: 警告: ポインタと整数との比較を行なっています main.c:36: 警告: ポインタと整数との比較を行なっています main.c:37: 警告: ポインタと整数との比較を行なっています main.c: In function 'dataScan': main.c:44: 警告: ポインタと整数との比較を行なっています プログラム↓ #include <stdio.h> #include <stdlib.h> struct image{ int type; int width; int height; int depth; char *data; }; int main(int argc, char *argv){ FILE *fpin; fpin = fopen("argv[1]", "rb"); struct image *img; headerScan(fpin, img); img->data = (char *)malloc(sizeof(char)*img->width*img->height*3); dataScan(fpin, img); free(img->data); fclose(fpin); return 0; } int headerScan(FILE *fp, struct image *img){ while(fscanf(fp, "P%d", &(img->type)) == NULL) ; while(fscanf(fp, "%d %d", &(img->width), &(img->height)) == NULL) ; while(fscanf(fp, "%d", &(img->depth)) == NULL) ; return 0; } int dataScan(FILE *fp, struct image *img){ int i = 0; while(fscanf(fp, "%c%c%c", &(img->data[i++]), &(img->data[i++]), &(img->data[i++])) != NULL) ; return 0; }

  • 多次元配列の受渡しでの警告

    多次元配列を関数に受け渡す際に、 警告: passing argument 1 of ‘mat_add’ from incompatible pointer type 警告: passing argument 2 of ‘mat_add’ from incompatible pointer type のような警告が出てきてしまいます。 プログラムは、明解C言語(柴田望洋著)で紹介されているサンプルプログラムなのですが(下に載せておきます)、どうしてこのような警告がでるのか分からず困っています。 多次元配列の渡し方になにか問題があるのでしょうか? #include <stdio.h> void mat_add(const int ma[][3], const int mb[][3], int mc[][3]) { int i,j; for(i=0; i<2; i++) for(j=0; j<3; j++) mc[i][j] = ma[i][j] + mb[i][j]; } int main(void) { int i,j; int ma[2][3] = {{9,2,-3},{4,5,1}}; int mb[2][3] = {{9,2,-3},{4,5,1}}; int mc[2][3] = {0}; mat_add(ma, mb, mc); for(i=0; i<2; i++){ for(j=0; j<3; j++) printf("%3d",mc[i][j]); putchar('\n'); } return(0); }

  • NULLポインタが0でない処理系とは?

    http://okwave.jp/qa/q7458540.html にて、 > C言語の規格上、0はNULLポインタとして扱われますが > NULLポインタは0とは限らないので(0でない処理系もあります)。 と他の回答者が答えていたのが妙に引っかかりました。 後学のために知っておきたいのですが、 どの処理系だとNULLポインタが0ではないのかどなたかご存じないですか? 気になって、C99の仕様書らしいものを検索で見つけたのですが、 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf これによると、6.3.2.3 Pointers の 3節 にて、 > An integer constant expression with the value 0, > or such an expression cast to type void *, is called a null pointer constant. とあり、7.17 Common definitions <stddef.h> の 3節 でも、 > The macros are > NULL > which expands to an implementation-defined null pointer constant; (略) とあるので、NULLポインタを表す定数は0か(void*)0だと思っていたのですが。 言い換えると、 struct foo { char* bar; }; と構造体が定義されている時、 struct foo baz; bzero(&baz, sizeof(baz)); すればbaz.barはNULLポインタ定数に初期化されると思っていたのですが、 これだとダメな処理系はどういう処理系で、どんな用途で使うのでしょうか? おそらく、0でない値にした目的や歴史的経緯があるのではないかと推測するのですが。

専門家に質問してみよう