指针-memset((void *)&hostaddr, 0, sizeof(hostaddr));

问题描述

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

解决方案

sizeof(void*)

解决方案二:

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语言更安全的一个体现...

时间: 2024-08-01 13:06:46

指针-memset((void *)&hostaddr, 0, sizeof(hostaddr));的相关文章

空指针(NULL,0),野指针,void*的讲解

一:野指针 "野指针"不是NULL指针,是指向"垃圾"内存的指针. "野指针"的成因主要有两种: (1)指针变量没有被初始化.任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气.所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存.例如      char *p = NULL;      char *str = (char *) malloc(100); (2)指针p被free或者

c++-C++中指针声明时,int* p=0跟int *p=0哪个比较好?为什么?

问题描述 C++中指针声明时,int* p=0跟int *p=0哪个比较好?为什么? 新手学习C++时候,发现有些书写 int* p=0; 有些书写: int *p=0; 这两个有区别吗?区别在哪里?为什么会有两种写法? 还有下面的两种有区别吗?区别在哪里? int* const p=0; int const *p=0; 解决方案 第一个问题,这是定义一个int* p指针变量,(int p)<--->(int p) 这两种是等价,编译器会处理中间的空白符问题.第二个问题,int *const

(*(void(*)())0)()

(*(void(*)())0)(),这是在C陷阱与缺陷中,关于解决计算机开机启动后,硬件读取首地址为0位置的子例程的代码. 先看(*fp)(),fp是一个函数指针,*fp就是该指针所指向的函数,(*fp)()就是调用该函数的方式. 我们按照题目要求假设可以的话,则字面上可以写成(*0)():但是,正如(*fp)(),运算符*必须要一个指针来作操作数,并且是函数指针,这样经过运算符*作用后的结果才能作为函数被调用.因此 ,需要对0进行类型转换,转换后的意思可以描述为:指向返回值为void类型的函数

C语言中闭包的探究及比较

这是一篇技术分享,并且之前发表在酷壳上,http://coolshell.cn/articles/8309.html,现在发布到自己的博客上. 下文是直接从酷客复制过来的,这里偷了个懒,没有再次对格式做很仔细的整理,只有稍微整理.汗. 这里主要讨论的是C语言的扩展特性block.该特性是Apple为C.C++.Objective-C增加的扩展,让这些语言可以用类Lambda表达式的语法来创建闭包.前段时间,在对CoreData存取进行封装时(让开发人员可以更简洁快速地写相关代码),我对block

TLS 处理

TLS(Thread Local Storage,线程局部存储)是一种便利的编程机制.我们通常不使用,因此并不太关心.但是要压缩的原程序可能会用到它.事实上,Delphi 总是使用它,如果我们打算支持 Delphi 程序,最好兼容它. TLS 基本上是通过 API 实现.大致过程是,你分配一个" Index(索引)"并存储在一个全局变量中.通过这个 Index 获得针对每个线程的一个双字值.通常使用这个值保存一个为每个线程分配好的内存块的指针.人们认为这样很乏味,一个特殊机制的出现使得

poj-POJ 1002 自测没问题 提交总是wrong answer

问题描述 POJ 1002 自测没问题 提交总是wrong answer #include #include #include #define type int char transfer[26]={2,2,2, 3,3,3, 4,4,4, 5,5,5, 6,6,6, 7,7,7,7, 8,8,8, 9,9,9,9}; typedef struct repeat { char num[8]; struct repeat * next; }RPT; void std(char * in,char

PostgreSQL flashback(闪回) 功能实现与介绍

标签 PostgreSQL , 脏读 , 事务 , flashback , 闪回 , drop , truncate , dml 背景 闪回的需求往往是救命的需求,因为通常情况下数据库正常运行是不需要闪回的,往往是出现了误操作,被攻击,被注入后,数据库的数据被删除或恶意纂改并且纂改的事务已提交,也就是说纂改已经被持久化了. 这种情况下需要闪回来救命,回到被破坏前的状态. 闪回的目标分为两种: DML闪回和DDL闪回. DML闪回指对INSET, UPDATE, DELETE操作的闪回.DDL闪回

Oracle中的游标、硬解析、软解析、软软解析、解析失败

Oracle中的游标.硬解析.软解析.软软解析.解析失败 一. 游标的分类及共享游标 游标(Cursor)是Oracle数据库中SQL解析和执行的载体,它可以分为共享游标(Shared Cursor)和会话游标(Session Cursor).共享游标可以细分为父游标(Parent Cursor)和子游标(Child Cursor),可以通过视图V$SQLAREA和V$SQL来查看当前缓存在库缓存(Library Cache)中的父游标和子游标,其中V$SQLAREA用于查看父游标,V$SQL用

怎么找出解析失败的sql

原创如有错误请指出 本文由我和公司同事问心共同测试分析完成. 很多时候我们会有这样一个误区,语法错误或者对象不存在应该在语法语义检查这个步骤就结束了,怎么还会存在共享池里面呢?带着这个几个问题我们做几个简单的测试. 我们先了解下什么是解析失败的 SQL? 1.SQL语法错误 2.访问的对象不存在 3.没有权限 那么怎么证明有哪些解析失败的SQL 我们知道 SQL 语句必须至少是一个父游标一个子游标存在的,当然生产中很多情况下都是一父多子的情况. 父游标与子游标结构是一样的,区别在于sql解析相关