强制类型转换时一个莫名奇妙的错误,

zhqyzhqychn 2009-02-20 07:17:53
在学习getaddrinfo函数的用法时,时如果写成

struct sockaddr_in tempaddr;
tempaddr=(struct sockaddr_in) aip->ai_addr; //aip是getaddrinfo返回的值
inet_ntop(AF_INET,(struct in_addr *)(&(tempaddr.sin_addr)),abuf,INET_ADDRSTRLEN);

就会报错 conversion to non-scalar type requested;

但是如果改成

struct sockaddr_in * tempaddr;
tempaddr=(struct sockaddr_in *) aip->ai_addr;
inet_ntop(AF_INET,(struct in_addr *)(&(tempaddr->sin_addr)),abuf,INET_ADDRSTRLEN);


编译就可以通过,两种方式就差一个地方一个是通过结构体变量的名字在使用.成员运算符引用成员,另一个使用指针并使用->引用成员,个人感觉两种都没什么问题啊,为什么会报错呢。
...全文
268 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
mymtom 2009-02-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fox000002 的回复:]
lz 用了不恰当的例子进行验证,试试

C/C++ codestructt
{inta[8];intb;
};

[/Quote]
结构体当然可以直接赋值

#include<stdio.h>
struct t
{
int a[8];
int b;
};
int main()
{
struct t a,b;
a.a[0]=1;
a.b=1;
b=a;
printf("%d,%d\n",b.a[0],b.b);
return 0;
}

zhqyzhqychn 2009-02-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fox000002 的回复:]
lz 用了不恰当的例子进行验证,试试


C/C++ code

struct t
{
int a[8];
int b;
};
[/Quote]
明白了,谢谢了
fox000002 2009-02-20
  • 打赏
  • 举报
回复
lz 用了不恰当的例子进行验证,试试



struct t
{
int a[8];
int b;
};

zhqyzhqychn 2009-02-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 guosha 的回复:]
晕,最基本的C语言知识啊

结构体有这么直接赋值的吗?
[/Quote]
学的时候确实说不行,差点给忘了,可是我刚试验了一下,编译没什么错误啊

#include<stdio.h>
struct t
{
int a;
int b;
};
int main()
{
struct t a,b;
a.a=1;
a.b=1;
b=a;
printf("%d,%d\n",b.a,b.b);
return 0;
}

编译运行都通过啊,不知道怎么回事
  • 打赏
  • 举报
回复
tempaddr=(struct sockaddr_in) aip->ai_addr;
tempaddr=(struct sockaddr_in *) aip->ai_addr;
你觉得2者没有区别啊?
第一句里ai_addr是一个sockaddr_in的结构,第2句是一个指向该结构的指针。你觉得数据和指向数据的指针没有区别?
楼主应该好好复习下指针。
mymtom 2009-02-20
  • 打赏
  • 举报
回复
aip->ai_addr 是 struct sockaddr * 类型,是个sockaddr结构指针,当然不能转为sockaddr_in结构类型。
但是可以强制转为struct sockaddr_in * 类型,即sockaddr_in结构指针。
快乐田伯光 2009-02-20
  • 打赏
  • 举报
回复
晕,最基本的C语言知识啊

结构体有这么直接赋值的吗?

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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