问题描述
- memset((void *)&hostaddr, 0, sizeof(hostaddr));
-
今天在看别人讲Socket编程的博客,里面有这么一句话,初始化客户端地址的。为什么要在&hostaddr前面加上(void*)?百度百科上面memset函数的原型是void *memset(void *s, int ch, size_t n),第一个参数传递一个指针进去就行了,那么&hostaddr不就是指针了吗?那为什么还要加(void*),(void*)在这个语句里面有什么作用? 附上博客地址 http://blog.csdn.net/wind19/article/details/6156339
解决方案
解决方案二:
void即“无类型”,void *则为“无类型指针”,可以指向任何数据类型。
由于void指针可以指向任意类型的数据,亦即可用任意数据类型的指针对void指针赋值,因此还可以用void指针来作为函数形参,这样函数就可以接受任意数据类型的指针作为参数。例如:
void * memcpy( void *dest, const void *src, size_t len );
void * memset( void * buffer, int c, size_t num);
具体可在google中搜索 “void 指针”查询用途和示例。
解决方案三:
void memset(void *s, int ch, size_t n)因为它需要的参数就是void *型的参数,而你的&hostaddr不是的,加上可以将它强制转换为void类型
解决方案四:
指针也是存在不同的类型的,根据指针所指向的地址存储的内容不同,指针的类型就是该指针指向内容的类型,&hostaddr是地址不错,但是其类型为hostaddr的类型,不是void* ,所以需要进行类型的强制转换。
解决方案五:
void指针可以转化为任意指针。就像malloc和free一样的。返回值和参数都是void* .你这个memset参数既然是void*那么你传进入的参数也要对应。他这里只是显示得强制转换了&hostaddr取地址之后的指针为void*,你不写也没得关系,编译器会帮你做隐式转换的。
解决方案六:
void* 是可以用任意类型指针赋值的。这里你不写 (void*) 是可以的。写了的话也不错。
解决方案七:
指针也是需要强转的,c++中一般指针必须得强转才能够符合库函数接口的要求,否则会报编译错误,但是c语言中编译器会自动隐式转换, 这也正是
c++比c语言更安全的一个体现...