• sizeof例子


    关于sizeof,我首先想说的是它是一个宏,不是一个函数,其次sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型,该类型保证能容纳实现所建立的最大对象的字节大小,sizeof用来计算数据类型所占的内存大小。

    先贴一些常见的sizeof求值对象:

    // sizeof.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    
    #include <stdio.h>
    #include <string.h>
    
    /* 整形结构体 */
    struct TestShort 
    {
    	/* a占四个字节 */ 
    	int a;
    	
    	/* c占1一个字节 */ 
    	char c;
    
    	/* short int 占2个字节 */
    	short int b;
    };
    
    struct TestShort1 
    {
    	/* c占1一个字节 */ 
    	char c;
    
    	/* a占四个字节 */ 
    	int a;
    
    	/* short int 占2个字节 */
    	short int b;
    };
    
    struct Test 
    {
    	/* a占四个字节 */ 
    	int a;
    	
    	/* c占1一个字节 */ 
    	char c;
    };
    
    /* 柔性结构体 */
    struct TestSoft 
    {
    	/* a占四个字节 */ 
    	int a;
    	
    	/* c占1一个字节 */ 
    	char c;
    	/* 定义了大小不确定的数组b,所以是柔性结构体 */
    	int b[];
    };
    
    /* long类型的结构体 */ 
    struct TestDouble 
    {
    	/* a占八个个字节 */ 
    	double a;
    	
    	/* c占1一个字节 */ 
    	char c;
    };
    
    int main(int argc, char *argv[])
    {
    	int data = 0;
    	int *pInt = &data;
    	int intArray[5] = {0};
    	int doubleIntArray[3][5];
    	
    	char charArray[10];
    	char pStr[] = "hello,world";
    	char *pChar = "hello,world";
    	char pOx[] = "\023cd";
    	char pUnox[] = "\03834";
    	char pUnox1[] = "\0834";
    	
    	/* int类型占4个字节,所以结果为4 */
    	printf( "sizeof(data) = %d\n", sizeof(data) );
    
    	/* int类型的指针,求的是指针所占的内存大小, 所以为一个int型数据大小即4 */
    	printf( "sizeof(pInt) = %d\n", sizeof(pInt) );
    
    	/* intArray为一个数组名,所以结果为数组的大小,即5*4=20 */
    	printf( "sizeof(intArray) = %d\n", sizeof(intArray) ); 
    
    	/* doubleIntArray为二维数组,结果为二维数组的大小即3*5*4=60 */
    	printf( "sizeof(doubleIntArray) = %d\n", sizeof(doubleIntArray) );
    	
    
    	/* 字符数组,结果为数组大小即10*1=1 */
    	printf( "sizeof(charArray) = %d\n", sizeof(charArray) );
    
    	/* 通过赋值确定大小的字符数组,结果依然为数组大小即12*1=12 */
    	printf( "sizeof(pStr) = %d\n", sizeof(pStr) );
    
    	/* pChar为一个指向字符串的指针,所以结果为指针大小即4 */
    	printf( "sizeof(pChar) = %d\n", sizeof(pChar) );
    
    	/* pOx为含有转义字符的字符串,\023为一个字符,结果为数组大小即4*1=4 */
    	printf( "sizeof(pOx) = %d\n", sizeof(pOx) );
    
    	/* pUnox同pOx一样,第一个字符为\03,由于8不属于八进制,所以结果为5*1=5 */
    	printf( "sizeof(pUnox) = %d\n", sizeof(pUnox) );
    
    	/* pUnox1同pUnox,不过第一个字符为\0,所以结果为5*1=6 */
    	printf( "sizeof(pUnox1) = %d\n", sizeof(pUnox1) );
    
    	/* 由于第一个字符为\0,所以字符串长度为0,所以结果为0 */
    	printf( "strlen(pUnox1) = %d\n", strlen(pUnox1) );
    	
    	/* double占八个字节 */
    	printf( "sizeof(double) = %d\n", sizeof(double) );
    
    
    	/* 结构体的大小要考虑按照结构体内最大数据类型大小对齐 */
    	/* 一个int占4个字节,一个char只需占一个字节就够了,但是要考虑
    	 * 对齐,且本结构体内最大的数据类型为int型(占4个字节),而c结构
    	 * 体内无其他数据了,所以char由于要对其,所以要给它分配四个字
    	 * 节,所以结构体的大小为4+4=8
    	 */
    	printf( "sizeof(struct Test) = %d\n", sizeof(struct Test) );
    
    	/* 同Test分析,但是由于后面的c和b加起来只需要分配3个字节,通过
    	 * 对齐后,可以分配在一个四字节的内存内,所以结果还是8 */
    	printf( "sizeof(struct TestShort) = %d\n", sizeof(struct TestShort) );
    
    	/* 由于只需一个字节,而接下来的a占四个字节,由于每一种数据类型的地址都
    	 * 要求能被数据类型大小整除,所以a需要占四个字节,所以结果为4+4+4=12 */
    	printf( "sizeof(struct TestShort1) = %d\n", sizeof(struct TestShort1) );
    
    	/* 由于结构体柔性结构体,最后面的数组不占内存所以结果和Test一样,即8 */
    	printf( "sizeof(struct TestSoft) = %d\n", sizeof(struct TestSoft) );
    
    	/* 此结构体的最大数据类型为8个字节的,所以本结构体的对齐是按照8字节对
    	* 齐的,所以本结构体的大小是8+8=16 */
    	printf( "sizeof(struct TestLong) = %d\n", sizeof(struct TestDouble) );
    
    	getchar();
    	return 0;
    }
    


    运行结果为:


    总结:sizeof求的是数据类型在内存中需要占有的内存大小(单位为字节),需要注意的几点如下

    1. 基本数据类型大小要记住;
    2. 要知道sizeof的求值对象,是一个普通变量还是指针,或者是数组;
    3. 对于指针而言,大小即为指针大小,不管是什么指针;
    4. 对于数组而言,sizeof的结果就是数组的大小;
    5. 对于求字符串的长度要注意转义字符,清楚什么时候是转义字符的结束;
    6. 求结构体(类)大小的时候要注意1)考虑对齐 2)对齐方式是以结构体最大的数据类型对齐的 3)每一种数据类型的地址都可以被其数据类型的大小整除;
    7. c和c++的sizeof('0')的结果是不一样的,c中会把'0'当成ini类型,而c++中则会把'0'当作char类型,所以才会有差异。
    相信要是掌握了上述的几点,那么对于sizeof的求值问题,应该就不是问题了。


  • 相关阅读:
    redis 设置分布式锁要避免死锁
    jmeter的简单http接口用法
    整理一些好的网站或者好的文章来慢慢学
    多线程的共享变量的内存不可见性如何理解
    谷歌浏览器可以google了
    org.apache.commons.dbcp.DelegatingPreparedStatement.isClosed()Z和NewProxyPreparedStatement.isClosed()
    php封装curl,模拟POST和GET请求HTTPS请求
    PHP 轻量级 REST框架
    使用 spring封装的javamail linux服务器发送邮件失败解决
    安装Ruby、Sass在WebStrom配置Scss编译环境css自动压缩
  • 原文地址:https://www.cnblogs.com/arbboter/p/4225222.html
Copyright © 2020-2023  润新知