7

voidポインターを使用してデータを渡し、それを(pData *)型にキャストしようとしています。私は何が間違っているのですか?gccは私に

gcc test.cエラー:構造体または共用体ではないものでのメンバー'filename'の要求

typedef struct data {
        char *filename;
        int a;
} pData;

void mod_struct(void *data) {
        printf("%s\n",(pData *)data->filename); //error on this line
}

void main() {
        pData *data;
        data = (pData *) malloc(sizeof(pData));
        data->filename = (char *)malloc(100);
        strcpy(data->filename,"testing testing");
        data->a=1;
        mod_struct((void *)&data);
}
4

5 に答える 5

11

する必要があります

printf("%s\n", ((pData *) data)->filename);

->演算子は型キャスト演算子よりも優先されます。

それに加えて、への呼び出しmod_structは次のようになります。

mod_struct((void *) data);

あなた&がそこにいるということは全く意味がありません。なぜあなたはいつあなたが必要としているものへのポインタであるかのアドレスを取っているのdataですdataか?

于 2011-03-21T23:59:53.513 に答える
4

(pData *)data->filenameと同等(pData *)(data->filename)です; 必要に応じて、parensを追加します((pData *)data)->filename

また、ところで、あなたのコードはクラッシュします。pData **キャストをに渡し、void *それをにキャストし直しpdata *ます。

于 2011-03-22T00:02:00.877 に答える
2

pData*のアドレスを取得してvoid*ポインターにキャストしています。したがって、実際にはpData**をvoid*にキャストしているため、適切に逆参照する必要があります。

(*(pData**)data)->filename

または単純に、メインでキャストするときにデータのアドレスを取得しないでください

mod_struct((void *)data);
于 2011-03-22T00:05:23.937 に答える
0
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>

 typedef struct {  
  char *filename;
  int a;
  }pdata;

void func(void * data)
{
  printf("%s \n",(*(pdata **)data)->filename);

}

int main()
{
  pdata *data;
  void *vptr=0;
  data=(pdata *)malloc(sizeof(pdata));
  data->filename=(char *)malloc(sizeof(50));
  vptr=&data;
  printf("enter the file name \n");
  scanf("%s ",data->filename);
  func(vptr);
  return 0;

}

于 2017-06-14T15:52:00.980 に答える
0

[ヒントCコード]@Damir:

  data=(pdata *)malloc(sizeof(pdata));

次のように修正する必要があります。

data = malloc(sizeof(pdata));

この場合、void *は他のポインタ型に自動的かつ安全にプロモートされるため、不要です。1つのケース:移植性。それはおそらく良いでしょうが、あなたの場合、私はそうは思いません、それは単なるヒントでした。必要に応じてキャストできますが、必要ないと思います。

ANSI C規格では、キャストは冗長です。

良い週末を。

于 2018-09-02T16:54:39.183 に答える