0

私は次のコードを持っています:

typedef struct PStruct{
int len;
char* data;
}PointerStruct;

typedef struct AStruct{
int len;
char data[256];
}ArrayStruct;

void checkFunc(PointerStruct* myData)
{
  if (0 == myData || 0 == myData->data){
  printf("error\n");
  }
}

int main()
{
   ArrayStruct my_data;
   my_data.len = 256;
   char data[] = "data is sent";
   my_data.data = &data;
   checkFunc((PointerStruct*)my_data);
   return 0;
 }

配列を持つ構造体を渡すのに問題がありますか。必要なのはポインターです。私にお知らせください。

4

1 に答える 1

0

プログラムで考慮すべき点がいくつかあります。

char data[] = "data is sent";

これは 13 文字の文字配列です。したがって、my_data.data = &data;以下に示すようにコンパイルエラーが発生します

error: incompatible types when assigning to type 'char[256]' from  type 'char (*)[13]'

文字列をコピーするには、おそらく以下に示すように strcpy を使用できます

strcpy(my_data.data, data);

次のポイントは、ポインターをオブジェクトに渡すことです。この呼び出しでcheckFunc((PointerStruct*)my_data);は、オブジェクトのインスタンスを関数呼び出しに渡していますが、ポインターとして型キャストしています。次のようなデータ型の不一致により、コンパイルの問題が発生します。error: cannot convert to a pointer type

このエラーを解決するには、my_dataオブジェクトへの参照を として渡す必要がありますcheckFunc((PointerStruct*) &my_data);。したがって、新しいmain関数は次のようになります

int main()
{
    ArrayStruct my_data;
    my_data.len = 256;
    char data[] = "data is sent";
    //my_data.data = &data;
    strcpy(my_data.data, data); // Use of strcpy. You would require to include <string.h>
    checkFunc((PointerStruct*)(&my_data)); // Pass a reference and not by value
    return 0;

}

これらの変更により、コードは正常に動作するはずです。

于 2013-03-22T01:41:36.753 に答える