嵌入式C语言笔试题:sizeof(void)

嵌入式技术

1330人已加入

描述

前两天有同学去做笔试题,遇到了这么一个题目:

sizeof(void);
  结果是多少?仔细一想,好像真没写过这样的代码。

void 也是C语言中常见的类型,一般用于修饰函数的类型。

比如函数不需要返回数据,就会在前面加上void。

void test();
  如果函数没有参数,形参括号里面也可以加上void。
void test(void);
  那 void 能不能用于定义变量?
void a;
  这个肯定不行,编译的时候就会当作语法错误处理。

原因的话,我觉得可能是定义变量的时候,编译器不好给他分配内存。
printf("%lu
", sizeof(void));
  在 Ubuntu 环境下,强行输出:
sizeof(void)
  结果是1,而且在gcc的相关文档中也明确表示,sizeof允许使用在void和函数名上,结果返回1。
In GNU C, addition and subtraction operations are supported on pointers to void and on pointers to functions. This is done by treating the size of a void or of a function as 1.


A consequence of this is that sizeof is also allowed on void and on function types, and returns 1.


The option -Wpointer-arith requests a warning if these extensions are used.
 
但是在其他编译器下结果怎么样,没有试过。

所以总结一下,sizeof(void)没什么实际意义。

但是 void * 类型就非常的实用。

它可以用来定义变量,表示变量是个指针,但是指针指向什么类型的数据,只有等使用的时候才知道。

因为指针是有长度的,所以编译器给他分配内存也没有问题。

再比如我们经常使用的malloc函数,它只负责在堆空间分配内存,但是这段内存保存什么类型的数据,也只有用户自己知道,于是malloc直接返回void *,反正它是个地址,等到使用的时候,再由用户进行强转就行。
char *addr = (char *)malloc(sizeof(char) * 128);
  前面我们讲过sizeof的很多用法,没想到它还是层出不穷,既然这样,我又想到了一个:
siezof('a');
  结果是多少?如果你知道答案,欢迎私信留言。     


审核编辑:汤梓红

 

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分