我正在尝试使用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);
}
答案 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标准下,转换是冗余的。
周末愉快。