c语言中有关void,sizeof,结构体的一些问题
void[1]:
void是C语言中的空类型,void的用途有二。
1、对函数返回的限定;
2、对函数参数的限定;
在c++中,函数参数为void意味着不接受参数,但是在c语言中可以给无参数的函数传递任意类型的参数,这点在turbo c中可以验证。
void*就是空类型指针,所谓空类型指针就是通用指针类型。它有以下特点。 1、按照ASC码标准void指针不能做算术操作,因为不确定其指向数据类型大小;
2、c++允许将任何类型的指针赋给void*,但是不允许void指针赋值给其它类型。必须显示的强制转换。
其它类型指针相互之间是否也可以强制装换?
强制转换后编译能通过,大部分情况下运行也是没有问题的,但是根据参考文献[4]的说法是容易出问题的,因为某些CPU对某些数据类型有对其限制,这样在做指针强制转换的时候就容易出现问题。
其实,其它类型指针之间的转换完全可以通过使用void*类型来避免。
sizeof[2]:
前面说在同一台机器上指针大小是固定的,通过sizeof测试int*,char*,bool*,double*都出结果都是4(32位机器测试)。
今天在程序中memset一个T*类型的指针,发现没有初始化成功,原来在memset的第三个参数中填的是sizeof(T*类型的指针)。特此总结了一下sizeof的一些问题。
1、char* s="0123456789";
sizeof(s)=4,s是一个指针。
sizeof(*s)=1,*s是第一个元素。
strlen(s)=10,s是字符串首地址。
2、char s[]="0123456789";
sizeof(s)=11,s是字符串数组,包括'\0'。
sizeof(*s)=1,*s是第一个元素。
strlen(s)=10,s是字符串首地址。
3、char s[20]="0123456789";
sizeof(s)=20,s是在内存中静态分配的大小。
sizeof(*s)=1,*s是第一个元素。
strlen(s)=10,s是字符串首地址。
结构体[3]:
结构体在字节对齐的时候有三个原则,有了这三个原则就很容易的可以计算出任意一个结构体的sizeof大小了。
1、结构体变量的首地址能够被其最宽基本类型的成员大小所整除;
2、结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
3、结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。
c语言中有关void,sizeof,结构体的一些问题相关推荐
- C语言中函数如何返回结构体?
//#include "stdafx.h"//If the vc++6.0, with this line. #include "stdio.h" #inclu ...
- c语言struct的作用和用法,c语言中的关键字struct(结构体)的用法
在iOS开发中,结构体是经常用到的数据类型,使用频率不亚于指针,所以需要重视. 当一个整体由多个数据构成时,我们可以用数组来表示这个整体,但是数组有个特点:内部的每一个元素都必须是相同类型的数据.然而 ...
- c语言系统时间的结构体变量,C语言中的系统时间结构体类型
1.time_t 类型:长整型,一般用来表示从1970-01-01 00:00:00时以来的秒数,精确度:秒:由函数time()获取: 该类型定义在头文件 /usr/include/sys/time. ...
- c语言全局变量结构怎么定义,C语言中如何定义全局结构体变量
匿名用户 1级 2014-12-29 回答 结构的定义 用户定义自己所需要的结构型,可以采用下列定义语句: 1 2 3 4 5 6 7 struct结构型名 { 数据类型符1 成员名1: 数据类型符2 ...
- 内存对齐的原理,作用,例子以及一些规划(中英文说明,适用sizeof结构体) ...
目录 题记 一 内存读取粒度 Memory access granularity 从内存的角度解释内存对齐的原理 队列原理 Alignment fundamentals Laz ...
- c语言中sizeof结构体,C语言中的sizeof用法
C语言中的sizeof是一个很有意思的关键字,经常有人用不对,搞不清不是什么.我以前也有用错的时候,现在写一写,也算是提醒一下自己吧.反正现在来看,还在搞sizeof是什么意思,怎么用正确,还是有点搞 ...
- c语言用数组直接填充结构体,C语言第11题:结构体数组的定义与使用 + 结构体数组排序...
C语言第11题:结构体数组的定义与使用 + 结构体数组排序 C语言第11题:结构体数组的定义与使用 + 结构体数组排序 注意: 一下赋值是不能使用的 但是在结构体中是可以直接进行赋值操作的 st[1] ...
- C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例
C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例 目录 一.简单介绍 二.结构体定义和使用 三. ...
- C语言学生信息管理系统(结构体数组,文件)
C语言学生信息管理系统(结构体数组,文件) 这是初学时写的一个程序,比较菜,不喜勿喷.在一个结构体里定义结构体内所有的信息(如果信息也需要分类则可以再定义一个结构体并在当前结构体内声明,我的这个代码在 ...
- Go语言全栈开发:结构体
文章目录 类型别名和自定义类型 结构体 练习题 Go语言中没有"类"的概念,也不支持"类"的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象 ...
最新文章
- cocos2d Labels and Fonts 标签和字体(附:关于Hiero的二三事)
- 算法c语言源码_C语言实现推箱子
- XML CDATA的作用
- java注册头像_注册页面头像上传的实现(javaweb相关)
- 如何验证本地磁盘或网络磁盘是否可以进行读写操作
- observer mode - theme change
- 面向航空航天工业领域的基于模型的仿真验证工具SkyEye
- Linux Shell脚本的10个有用的“面试问题和解答”
- 《python透明人士,他是凭什么成为主流编程的宠儿?!》python基础语法
- JDBC连接池与工具类
- Cortex - M3 一些基础知识
- 力扣-61 旋转链表
- wiki oi3117 高精度练习之乘法
- postman高级用法--断言(Response body:JSON value check)
- 学习Wireshark之二:数据包分析
- 安卓系统车牌离线识别,优秀的车牌识别算法
- 什么是软件架构?常用的软件架构
- [CTSC2010]珠宝商(点分治+根号分治+后缀自动机)
- 【数据库基础】数据库的视图操作
- web应用界面设计规范(1)_软件测试资料大全