从(void *)类型中取消引用结构

时间:2011-03-21 23:57:43

标签: c void-pointers

我正在尝试使用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);
}

5 个答案:

答案 0 :(得分:10)

应该是

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

->运算符的优先级高于类型转换运算符。

除此之外,您对mod_struct的调用应如下所示

mod_struct((void *) data);

你在那里&完全没有意义。当data已经指向您需要的内容时,为什么要使用data的地址?

答案 1 :(得分:4)

(pData *)data->filename相当于(pData *)(data->filename);如果您希望它为((pData *)data)->filename,请添加parens。

另外,BTW,你的代码会崩溃。您将pData **广告投放转移到void *,然后将其转发回pdata *

答案 2 :(得分:2)

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

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

或简单在主要

中投射时不取数据地址
mod_struct((void *)data);

答案 3 :(得分: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;

}

答案 4 :(得分:0)

[提示C代码] @Damir:

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

应该这样纠正:

data = malloc(sizeof(pdata));

这是不必要的,因为在这种情况下,void *将自动安全地提升为任何其他指针类型。在一种情况下:可移植性。可能会很好,但是对于您而言,我不这么认为,这只是一个提示。如果愿意,可以投,但我认为没有必要。

在ANSI C标准下,转换是冗余的。

周末愉快。