-PR-
解決済み

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

  • すぐに回答を!
  • 質問No.11973
  • 閲覧数131
  • ありがとう数9
  • 気になる数0
  • 回答数8
  • コメント数0

お礼率 0% (0/9)

関数の引数でポインタのポインタを渡したいのですが、
渡す前後でアドレスが壊れてしまっています。
もし、なにか思い当たることがある人がいましたら、
必要事項があれば補足します。
よろしくお願いします。
通報する
  • 回答数8
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.8
レベル12

ベストアンサー率 40% (230/562)

参考までに正しい例。

----------------------------------------------------

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件)

  • 回答No.2
レベル12

ベストアンサー率 40% (230/562)

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


  • 回答No.1
レベル10

ベストアンサー率 33% (38/115)

単純にソースが間違っているのか、コンパイラのバグなのか、OSのせいなのか、なんともいえません。

まずは、該当個所のソース、ご使用のコンパイラ、OSを教えてください。
補足コメント
BaKe

お礼率 0% (0/9)

コンパイラ:VC++
OS:NT4.0SP6

//ここから

intMSGCHK_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);
}
intinit_check_func( char* buf, char** cbuf ,int arrange)
{
}

//ここまで
よろしくお願いします。
投稿日時 - 2000-11-02 11:09:55
  • 回答No.3

関数に引数を渡す際にキャストする必要は
ないのでは?
Ret = init_check_func(buff,combuff,6);

で大丈夫だと思いますが・・・
アドレス渡すんだから、キャストかけたら
まずくない?

ではでは☆
  • 回答No.4

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

ではでは☆
  • 回答No.6
レベル12

ベストアンサー率 40% (230/562)

すみません。
参考URLの絵の右のほうの
char[2][1]
と書いてあるのは
char[3][2]
の間違いです。
  • 回答No.5
レベル12

ベストアンサー率 40% (230/562)

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

ベストアンサー率 40% (230/562)

何度もすみません。

この絵は、メモリを表したもので、その中でどのように変数が領域を割り当てられるかを示したものです。

x[3][2]は連続して配置されますが、y**は連続しません。しかも、y[0]、y[1]それぞれの要素には、動的なまたは静的なchar*が入っていなければなりません。

こんな説明でわかるでしょうか。
このQ&Aで解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-

特集


抽選で合計100名様にプレゼント!

ピックアップ

ページ先頭へ