C语言VOID类型大小

    今天和同事在VOID指针类型大小的理解上有些分歧,下面的代码,我理解void类型指针大小不固定,如下使用取出来的指针不确定,

同事坚持说没有问题,他一直都是这样用,并且void *指针类型就是char *类型。

/*

 *释放CCB消息
 */
void CCB_FreeMsg(void *pMsg)
{
    CCB_MSG_S *pstCcbMsg = NULL;
    
    if (pMsg != NULL)
    {
        pstCcbMsg = (CCB_MSG_S *)(pMsg - sizeof(CCB_MSG_S));    
        CDP_FreeMsg((void *)pstCcbMsg);
    }


    return;

}


    后来百度查了下资料,发现void类型的指针理解果然存在ANSI和GNU两派,我是ANSI派,同事是GNU派的。

今天又长只是了,摘录原文如下:

按照ANSI(American National Standards Institute)标准,不能对void指针进行算法操作,即下列操作都是不合法的:
void * pvoid;
pvoid++; //ANSI:错误
pvoid += 1; //ANSI:错误
// ANSI标准之所以这样认定,是因为它坚持:进行算法操作的 指针必须是确定知道其指向 数据类型大小的。
//例如:
int *pint;
pint++; //ANSI:正确
pint++的结果是使其增大sizeof(int)。( 在VC6.0上测试是sizeof(int)的倍数)
但是大名鼎鼎的GNU(GNU's Not Unix的缩写)则不这么认定,它指定void *的算法操作与char *一致。
因此下列语句在GNU 编译器中皆正确:
pvoid++; //GNU:正确
pvoid += 1; //GNU:正确
pvoid++的执行结果是其增大了1。( 在VC6.0上测试是sizeof(int)的倍数)
在实际的 程序设计中,为迎合ANSI标准,并提高程序的可移植性,我们可以这样编写实现同样功能的代码:
void * pvoid;
(char *)pvoid++; //ANSI:正确;GNU:正确
(char *)pvoid += 1; //ANSI:错误;GNU:正确
GNU和ANSI还有一些区别,总体而言,GNU较ANSI更“开放”,提供了对更多语法的支持。但是我们在真实设计时,还是应该尽可能地迎合ANSI标准。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值