- ベストアンサー
関数の引数でポインタのポインタを渡したいのですが・・・
関数の引数でポインタのポインタを渡したいのですが、 渡す前後でアドレスが壊れてしまっています。 もし、なにか思い当たることがある人がいましたら、 必要事項があれば補足します。 よろしくお願いします。
- みんなの回答 (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)
何度もすみません。 この絵は、メモリを表したもので、その中でどのように変数が領域を割り当てられるかを示したものです。 x[3][2]は連続して配置されますが、y**は連続しません。しかも、y[0]、y[1]それぞれの要素には、動的なまたは静的なchar*が入っていなければなりません。 こんな説明でわかるでしょうか。
- haporun
- ベストアンサー率40% (230/562)
すみません。 参考URLの絵の右のほうの char[2][1] と書いてあるのは char[3][2] の間違いです。
- haporun
- ベストアンサー率40% (230/562)
combuffはchar[6][8]型なので、単にcombuffと書いた場合はchar(*)[8]型と解釈されます。 それをchar**にキャストすると、正しい動作はしません。 言葉で説明するのは難しいので、絵で説明しますので、参考URLをごらんください。 といっても、絵で説明するのも難しいですね。
試してみましたけど、確かにうまくいきませんね。 もう少し試して、うまくいったら回答します。 #といっても時間かかりますが・・・ ではでは☆
関数に引数を渡す際にキャストする必要は ないのでは? Ret = init_check_func(buff,combuff,6); で大丈夫だと思いますが・・・ アドレス渡すんだから、キャストかけたら まずくない? ではでは☆
- haporun
- ベストアンサー率40% (230/562)
ソースファイルの一部を補足してくださると、アドバイスしやすいと思います。
- katuya
- ベストアンサー率33% (38/115)
単純にソースが間違っているのか、コンパイラのバグなのか、OSのせいなのか、なんともいえません。 まずは、該当個所のソース、ご使用のコンパイラ、OSを教えてください。
補足
コンパイラ: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) { } //ここまで よろしくお願いします。