• ベストアンサー

関数の引数でポインタのポインタを渡したいのですが・・・

関数の引数でポインタのポインタを渡したいのですが、 渡す前後でアドレスが壊れてしまっています。 もし、なにか思い当たることがある人がいましたら、 必要事項があれば補足します。 よろしくお願いします。

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

  • ベストアンサー
  • haporun
  • ベストアンサー率40% (230/562)
回答No.8

参考までに正しい例。 ---------------------------------------------------- int init_check_func(char *buf, char **cbuf, int arrange){ return 0; } int MSGCHK_func(char *buff){ int Ret = 0; char *combuff[6]; for(int n = 0; n < 6; n++){ combuff[n] = (char*)calloc(8, 1); } strcpy(combuff[0], "ERROR"); strcpy(combuff[1], "OFFLINE"); strcpy(combuff[2], "DISABLE"); strcpy(combuff[3], "ACTIVE"); strcpy(combuff[4], "WARNING"); strcpy(combuff[5], "DOWN"); Ret = init_check_func(buff, combuff, 6); for(n = 0; n < 6; n++){ free(combuff[n]); } return Ret; } ---------------------------------------------------- または、 ---------------------------------------------------- typedef char CHAR8[8]; int init_check_func(char *buf, CHAR8 *cbuf, int arrange){ return 0; } int MSGCHK_func(char *buff){ int Ret = 0; char combuff[6][8]; memset(combuff,'\0', sizeof combuff); strcpy(combuff[0], "ERROR"); strcpy(combuff[1], "OFFLINE"); strcpy(combuff[2], "DISABLE"); strcpy(combuff[3], "ACTIVE"); strcpy(combuff[4], "WARNING"); strcpy(combuff[5], "DOWN"); Ret = init_check_func(buff, combuff, 6); return Ret; } ---------------------------------------------------- 長くてすみません。 ちなみに、OKWEBは行頭のスペースを削除してくれちゃうので、見にくいですね。 このようにメモリ配置とかの勉強ばっかして、実用プログラムをぜんぜん作ったことのないhaporunでした。 ちなみに、本職はVBです。

その他の回答 (7)

  • haporun
  • ベストアンサー率40% (230/562)
回答No.7

何度もすみません。 この絵は、メモリを表したもので、その中でどのように変数が領域を割り当てられるかを示したものです。 x[3][2]は連続して配置されますが、y**は連続しません。しかも、y[0]、y[1]それぞれの要素には、動的なまたは静的なchar*が入っていなければなりません。 こんな説明でわかるでしょうか。

  • haporun
  • ベストアンサー率40% (230/562)
回答No.6

すみません。 参考URLの絵の右のほうの char[2][1] と書いてあるのは char[3][2] の間違いです。

  • haporun
  • ベストアンサー率40% (230/562)
回答No.5

combuffはchar[6][8]型なので、単にcombuffと書いた場合はchar(*)[8]型と解釈されます。 それをchar**にキャストすると、正しい動作はしません。 言葉で説明するのは難しいので、絵で説明しますので、参考URLをごらんください。 といっても、絵で説明するのも難しいですね。

参考URL:
http://www.sic.shibaura-it.ac.jp/~p00050/pictures/temp0.gif
noname#9414
noname#9414
回答No.4

試してみましたけど、確かにうまくいきませんね。 もう少し試して、うまくいったら回答します。 #といっても時間かかりますが・・・ ではでは☆

noname#9414
noname#9414
回答No.3

関数に引数を渡す際にキャストする必要は ないのでは? Ret = init_check_func(buff,combuff,6); で大丈夫だと思いますが・・・ アドレス渡すんだから、キャストかけたら まずくない? ではでは☆

  • haporun
  • ベストアンサー率40% (230/562)
回答No.2

ソースファイルの一部を補足してくださると、アドバイスしやすいと思います。

  • katuya
  • ベストアンサー率33% (38/115)
回答No.1

単純にソースが間違っているのか、コンパイラのバグなのか、OSのせいなのか、なんともいえません。 まずは、該当個所のソース、ご使用のコンパイラ、OSを教えてください。

BaKe
質問者

補足

コンパイラ:VC++ OS:NT4.0SP6 //ここから int MSGCHK_func(char* buff) { int Ret = 0; char combuff[6][8]; memset(combuff,'\0',sizeof(combuff)); strcpy( combuff[0], "ERROR"); strcpy( combuff[1], "OFFLINE"); strcpy( combuff[2], "DISABLE"); strcpy( combuff[3], "ACTIVE"); strcpy( combuff[4], "WARNING"); strcpy( combuff[5], "DOWN"); Ret = init_check_func( buff, (char**)combuff, 6); return(Ret); } int init_check_func( char* buf, char** cbuf ,int arrange) { } //ここまで よろしくお願いします。

関連するQ&A