2017-08-14 13 views
0

私はlibラッパーを書く必要があります。ラッパー関数のプロトタイプは次のようになります。固定長配列型の関数引数にポインタを渡すにはどうすればよいですか?

int my_wrapper(char * configstr); 

ラップする関数は次のようになります。

void my_function(char config[CONFIGSTRSIZE]); 

私は、次の操作を実行しようとした:

int my_wrapper(char * configstr) 
{ 
    my_function(configstr); 
    return 0; 
} 

これは、コンパイルして動作しますが、私はエラーが表示されます。引数が無効な型であると私に伝えます。ポインタのターゲットタイプ

から

破棄予選呼び出し関数のポインタは、常に適切なサイズのポインタであるコンパイラを伝えるにキャストを実行する方法はありますか?

インターフェイスを変更することはほぼ不可能です。私はあなたのフィードバックに感謝します。

+7

'void my_function(char config [CONFIGSTRSIZE])is ** identical **を 'void my_function(char * config)'に置き換えます。 –

+4

*ラッパー*は必要ありません。たぶん、あなたは 'const char *'を渡そうとしていますか?あなたの呼び出しコードを表示してください... –

+3

'char()[size]'と 'char *'は**同じタイプではありません**。しかし、**配列**を渡すことは不可能なので、配列型を関数宣言に書くと、自動的に対応するポインタ型に調整されます。したがって、宣言は実際には@OliverCharlesworthによって指摘されたものと同じです –

答えて

1

まず法的ものの、次の関数宣言は、あまり意味がありません。

void my_function(char config[CONFIGSTRSIZE]); 

それはあなたが何とかは(固定サイズで)配列を渡すことができるという間違った印象を作成します。することはできませんC.で実際に何が起こるかは、Cは、対応するポインタ型への関数宣言における任意の配列型を調整するので、この宣言はちょうど

void my_function(char *config); 

あなたはこのようにそれを書くことができるようになってしまうということですポインタが渡されたことを強調するためには、アレイ(私はないに好むが、それはスタイルの問題だ)を指している必要があります:

あなたの問題のために今
void my_function(char config[]); 

、エラーメッセージに応じて、あなたは」あなたを得ますおそらくを渡そうとしています- ここには修飾されたポインタがあります。

  1. my_function()

    のみ読み取り配列:my_function()が何をしているかに応じて、2つのソリューションがあります。

    void my_function(const char *config); 
    
  2. my_function()も配列を変更します。そして、あなたはこのような関数プロトタイプを変更する必要があります。そこにいくつかのconstデータを渡すことはできませんが、データのをコピーすることがあります。データが文字列であると仮定すると、それを行うための一つの方法は、以下のようになります。

    // having some const char *config 
    char *cfgcopy = malloc(strlen(config)+1); 
    
    if (cfgcopy) { // allocation succeeded 
        strcpy(cfgcopy, config); 
        my_function(cfgcopy); 
        // do something with the modified cfgcopy 
        free(cfgcopy); 
    } 
    

    代わりmalloc()/strcpy()のため、多くの実装は、あなたが使用することができ、「速記」strdup()機能を提供します。しかし、strdup()は標準Cの一部ではないことに注意してください。

1

呼び出し元の関数の ポインタは常に正しい サイズのポインタであるコンパイラを伝えるにキャストを実行する方法はありますか?

Cでは不可能です。ポインタにはサイズに関する情報がありません。追加のパラメータとして渡すか、参照されないオブジェクトにこの情報を入れる必要があります(たとえば、最初にCの文字列のようなサイズや終了値を指定する必要があります)

関連する問題