void*的用法为什么会出错?

pinkfIoyd 2013-07-11 06:03:58
代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct
{
int num;
char name[10];
}A;

typedef struct
{
int a;
float b;
void* c;
}TEST;

int main(void)
{
TEST t = {0};
A a = {0};

(A*)t.c = (A*)malloc(sizeof(A));

t.a = 10;
t.b = 2.1f;
t.c->num = 10;

return 0;
}


为什么到就出错

t.c->num = 10;


出错信息是:

error C2223: left of '->num' must point to struct/union


求原因???

代码的意思是实现一个不定结构体,需要的时候给它指向所需的结构体。
...全文
268 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
wizard_tiger 2013-07-13
  • 打赏
  • 举报
回复
->表示*(t.c)而c是一个void*是不可以进行*运算的。
jun_for_linux 2013-07-13
  • 打赏
  • 举报
回复
(A*)t.c = (A*)malloc(sizeof(A)); 这一句中的执行顺序是什么样子呢?不同的编译器有不同的结果,但有一点是确定的,就是作为左值的t.c在强制类型转换时(A *)t.c的行为如下:产生一个临时变量,这个临时变量的类型为A *,他是由t.c转换而来,之后,这个临时变量被赋值为malloc得到的地址,最后,也就是这里最主要的毛病,在这句语句执行完成后这个临时变量被销毁,注意,在这里痛痒产生了内存泄露(因为malloc的内存没有free)。而对于t.c本身这条语句是没有对他进行任何操作的。这个例子我曾在《effective c++》这本书中看到,尽管是描述c++的。希望对你有帮助。
自信男孩 2013-07-13
  • 打赏
  • 举报
回复
需要做一下类型转换。
mujiok2003 2013-07-12
  • 打赏
  • 举报
回复
void*只能存储地址,不能对其进行*,->
明月书君 2013-07-12
  • 打赏
  • 举报
回复
引用 10 楼 Mr_warm 的回复:
引用 8 楼 shao_winds 的回复:
[quote=引用 5 楼 my_c_linux 的回复:] [quote=引用 3 楼 shao_winds 的回复:] void*表示指向一个空引用,你这么写当然不行,它根本就什么都没有指向,当然不能赋值给里面的成员
赋值是不是强制转换了吗?
强制转换不改变变量本身的类型呀, 后面再次使用还是空类型啊,[/quote] 正解![/quote] LZ可以在后面使用的时候再次强制类型转换,或者干脆在前面转换的时候把值赋给一个相应类型的变量,毕竟强制转换还是越少越好把
pinkfIoyd 2013-07-12
  • 打赏
  • 举报
回复
引用 8 楼 shao_winds 的回复:
引用 5 楼 my_c_linux 的回复:
[quote=引用 3 楼 shao_winds 的回复:] void*表示指向一个空引用,你这么写当然不行,它根本就什么都没有指向,当然不能赋值给里面的成员
赋值是不是强制转换了吗?
强制转换不改变变量本身的类型呀, 后面再次使用还是空类型啊,[/quote] 正解!
pinkfIoyd 2013-07-12
  • 打赏
  • 举报
回复
引用 7 楼 max_min_ 的回复:
[quote=引用 楼主 Mr_warm 的回复:] 代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct 
{
	int  num;
	char name[10];
}A;

typedef struct
{
	int a;
	float b;
	void* c;
}TEST;

int main(void)
{
	TEST t = {0};
	A a = {0};
	
	(A*)t.c = (A*)malloc(sizeof(A));
	
	t.a = 10;
	t.b = 2.1f;
	t.c->num = 10;

	return 0;
}
为什么到就出错

t.c->num = 10;
出错信息是:

error C2223: left of '->num' must point to struct/union
求原因??? 代码的意思是实现一个不定结构体,需要的时候给它指向所需的结构体。
(A*)t.c = (A*)malloc(sizeof(A));// 是要把结构体t中的成员c强转成A类型而已
((A*)(t.c))->num = 10;//这样直观安全
[/quote] 那就是“*”号的优先级比“.”高?
明月书君 2013-07-12
  • 打赏
  • 举报
回复
引用 5 楼 my_c_linux 的回复:
引用 3 楼 shao_winds 的回复:
void*表示指向一个空引用,你这么写当然不行,它根本就什么都没有指向,当然不能赋值给里面的成员
赋值是不是强制转换了吗?
强制转换不改变变量本身的类型呀, 后面再次使用还是空类型啊,
max_min_ 2013-07-12
  • 打赏
  • 举报
回复
引用 楼主 Mr_warm 的回复:
代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct 
{
	int  num;
	char name[10];
}A;

typedef struct
{
	int a;
	float b;
	void* c;
}TEST;

int main(void)
{
	TEST t = {0};
	A a = {0};
	
	(A*)t.c = (A*)malloc(sizeof(A));
	
	t.a = 10;
	t.b = 2.1f;
	t.c->num = 10;

	return 0;
}
为什么到就出错

t.c->num = 10;
出错信息是:

error C2223: left of '->num' must point to struct/union
求原因??? 代码的意思是实现一个不定结构体,需要的时候给它指向所需的结构体。
(A*)t.c = (A*)malloc(sizeof(A));// 是要把结构体t中的成员c强转成A类型而已
((A*)(t.c))->num = 10;//这样直观安全
max_min_ 2013-07-12
  • 打赏
  • 举报
回复
引用 1 楼 wangliangffaflgh 的回复:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct
{
    int  num;
    char name[10];
}A;

typedef struct
{
    int a;
    float b;
    void* c;
}TEST;

int main(void)
{
    TEST t = {0};
    A a = {0};
    
    t.c = (A*)malloc(sizeof(A));
    
    t.a = 10;
    t.b = 2.1f;
    ((A*)(t.c))->num = 10;
    
    return 0;
}
++ , 正解
C_linux记事 2013-07-12
  • 打赏
  • 举报
回复
引用 3 楼 shao_winds 的回复:
void*表示指向一个空引用,你这么写当然不行,它根本就什么都没有指向,当然不能赋值给里面的成员
赋值是不是强制转换了吗?
明月书君 2013-07-11
  • 打赏
  • 举报
回复
void*表示指向一个空引用,你这么写当然不行,它根本就什么都没有指向,当然不能赋值给里面的成员
flyrack 2013-07-11
  • 打赏
  • 举报
回复
((A*)t.c)->num = 10;
测试NULL 2013-07-11
  • 打赏
  • 举报
回复


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct
{
    int  num;
    char name[10];
}A;

typedef struct
{
    int a;
    float b;
    void* c;
}TEST;

int main(void)
{
    TEST t = {0};
    A a = {0};
    
    t.c = (A*)malloc(sizeof(A));
    
    t.a = 10;
    t.b = 2.1f;
    ((A*)(t.c))->num = 10;
    
    return 0;
}

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧