C语言中的void--(译)

Posted by AlstonWilliams on February 17, 2019

打算深入的学习一下操作系统以及C语言,通过《Beginning Linux Programming,4Ed》这本书。研究书中的源代码时,就遇到了*void **.由于以前学习C语言时,只是简单的学习了一下语法,并没有深入的学习,所以,看到这个让我很懵逼。

在Java中,我们使用void的场景,只有当作为函数的返回值时。那C语言中,*void **到底是什么意思呢?

Google找到了一篇文章,下面我把它翻译下来。尽管这篇文章的评论中批评作者写的不是很通俗易懂,不够条理。但是我看着写的还不错。基本上把*void **的作用说出来了。

下面开始正文。

在C语言中,*void *是一个没有数据类型的指针。所以,void **可以存放任何类型的数据的地址,并且可以被转换成任意类型。

*void *的优点:*malloc()*函数和*colloc()*函数的返回值,都是void **,这样,我们就能用这些函数来为任意类型分配内存了。

注意:上面的程序是在C语言环境中编译的,而不是在C++环境中编译的。在C++中,我们必须明确的将malloc函数的返回值转换成*int **.

当然,*void **也有一些限制:

  • *void *不能被dereferenced(这个单词翻译成中文感觉很难懂,这里就直接使用这个单词。这句话的意思是,void **形式的指针变量,不能通过在其前面添加星号的形式来获取其值)。例如,下面的程序就不正确:

输出Compiler Error: ‘void*’ is not a pointer-to-object type.

下面的程序却能正常编译并输出正确结果,因为我们预先将*void *类型的指针转换成了int **类型的指针:

会输出正确的结果,10.这里有一点需要注意,别乱用*void **在不同数据类型的指针之间转换,因为不同数据类型占用的字节数不一样,乱用很可能会导 致出现不正确的结果。

  • C语言标准中,不允许对*void *进行指针的运算。然而,在GNU C中,却是可以的。void **的长度会被判定为1.例如下面的程序,可以在gcc中,被正常编译并运行。

输出结果为2.