7

我正在尝试使用 void 指针传递数据,然后将其转换为 (pData *) 类型。我究竟做错了什么?gcc 给了我

gcc test.c 错误:请求成员“文件名”不是结构或联合

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

&在那里绝对没有意义。您为什么要获取datawhen的地址data已经是指向所需内容的指针?

于 2011-03-21T23:59:53.513 回答
4

(pData *)data->filename相当于(pData *)(data->filename); 如果需要,请添加括号((pData *)data)->filename

另外,顺便说一句,您的代码会崩溃。您将一个pData **演员传递给void *,然后将其转换回pdata *.

于 2011-03-22T00:02:00.877 回答
2

您通过获取它的地址将 pData* 转换为 void* 指针。所以您实际上是在将 pData** 转换为 void*,因此您需要正确取消引用它

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

或者简单地在你输入 main 时不要取数据的地址

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 * 会自动且安全地提升为任何其他指针类型。在一种情况下:可移植性。这可能会很好,但在你的情况下,我不这么认为,这只是一个提示。如果你愿意,你可以投,但我认为没有必要。

在 ANSI C 标准下,演员表是多余的。

有一个美好的周末。

于 2018-09-02T16:54:39.183 回答