精华内容
下载资源
问答
  • C语言内存字节对齐

    2016-04-30 18:28:58
    我们常常回来讨论结构体的内存大小 比如下面这段代码:#include #include struct arr { int a; int b; }; int main() { printf("%d", sizeof(struct arr)); system("pause"); return 0; }我们可以知道这最终...

    1.结构体的内存大小

    比如下面这段代码:

    #include<stdio.h>
    #include<stdlib.h>
    struct arr
    {
        int a;
        int b;
    };
    int main()
    {
    
        printf("%d", sizeof(struct arr));
        system("pause");
        return 0;
    }

    我们可以知道这最终输出为8,当然,struct的大小是每个成员大小的和,所以4+4就是8。

    如果你按照上面这样理解下面的这一段代码:

    #include<stdio.h>
    #include<stdlib.h>
    struct arr
    {
        int a;
        char c;
        int b;
        char d;
    };
    int main()
    {
    
        printf("%d", sizeof(struct arr));
        system("pause");
        return 0;
    }

    你认为输出会是多少呢?是上面那样4+1+4+1=10吗?

    答案是输出为16,这里,就牵扯到了一个叫做内存字节对齐的问题
    上述结构体,在内存中的存储方式,其实就可以这样理解:
    这里写图片描述

    采用内存对齐的方式,使得我们查找信息更加方便,缺陷是浪费了一些空间。

    其实字节对齐的细节和具体编译器实现相关,但一般而言,满足下面的三条准则。

    • 字节对齐的三条准则:

    1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
    2) 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;例如上面第二个结构体变量的地址空间。
    3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。

    所谓最宽基本类型是指像char、short、int、float、double这样的内置数据类型。“数据宽度”就是指其sizeof的大小。诸如结构体、共用体和数组等都不是基本数据类型。

    对上述三条准则的理解:

    #include<stdio.h>
    #include<stdlib.h>
    struct arr
    {
        char a;
        char arr[11];
    };
    int main()
    {
    
        printf("%d", sizeof(struct arr));
        system("pause");
        return 0;
    }

    在这里我们可以知道,这里的struct占12个字节,12可以整除1,所以结果就是12。在这最宽基本类型为char ,最终的结果为12,是1个的整数倍。

    #include<stdio.h>
    #include<stdlib.h>
    struct arr
    {
        short a;
        char arr[11];
    };
    int main()
    {
    
        printf("%d", sizeof(struct arr));
        system("pause");
        return 0;
    }

    这里呢,最宽基本类型是short,占2个字节,所以内存在存储时候,将是下面这种情况:
    这里写图片描述
    这里我们11+2无法整除,所以,这里我们多开辟一块空间,11+2+1整除2。
    所以我们可以得到最终的结果就是14。
    结果14,是最宽基本类型short的整数倍。

    所以,对于最宽基本类型就相当于对内存的存查大小的一个限定。所以后续的操作你也可以根据上述的分析一样分析。

    对于第二条的理解:

    #include<stdio.h>
    #include<stdlib.h>
    struct ar
    {
        char ch;
        int a;
        short s;
    };
    int main()
    {
        printf("%d\n", sizeof(struct ar));
    
    }

    在这里,进行偏移时,假设结构体的地址为300500,ch地址300200,这时候0可以被1整除,那么偏移到a的地址就是300204,这时候300504-300500就可以整除4,到s偏移为300208,这时候就可以整除4,所以总共这时候是12个字节。

    二对于下面这种方式:

    #include<stdio.h>
    #include<stdlib.h>
    struct ar
    {
        char ch;
        short s;
        int a;
    };
    int main()
    {
        printf("%d\n", sizeof(struct ar));
    
    }

    在这里假设结构体地址300200,那么首先ch地址为300200,这时候300200-300200可以整除1,接下来偏移,300201不可以整除2,所以再向后偏移到300202,然后一直便宜到300204,300204可以被4整除,所以这里总共8个字节。

    例:

    #include<stdio.h>
    #include<stdlib.h>
    struct ar
    {
        char ch;
        short s;
        double a;
        int num;
        char arr[19];
    };
    int main()
    {
        printf("%d\n", sizeof(struct ar));
        system("pause");
    
    }

    这个例子中,我们可以按照上面的方式来进行分析,假设结构体首地址200200,那么ch就是200200-200200=0,0可以整除1,然后接下来是short,200201-200200不可以整除2,所以接下来,要根据对齐,补齐,所以偏移到200202,然后下面200204-200200不能整除8,所以偏移至200208,接下来200216-200200可以整除4,所以偏移至200216,然后200220-200200整除1,可以整除,偏移至200220,接下来要考虑最宽数据类型,现在所占的字节数为8+8+4+19,所以填充一个字节,最终结果为40个字节大小。

    2.共用体的内存对齐

    对于共用体,也是一样的,也遵守结构体三个规则,共用体的大小也必须是最宽基本类型大小整数倍。
    如:

    #include<stdio.h>
    #include<stdlib.h>
    union ar
    {
        char ch;
        short s;
        double a;
    
    };
    int main()
    {
        printf("%d\n", sizeof(union ar));
        system("pause");
    
    }

    最宽数据类型为double,所以,输出最终为8。

    如:

    #include<stdio.h>
    #include<stdlib.h>
    union ar
    {
        int ch;
        char arr[13];
    
    
    };
    int main()
    {
        printf("%d\n", sizeof(union ar));
        system("pause");
    
    }

    这里依然,需要最后的结果是最宽数据类型的整数倍,因为最大的变量为arr,长度为13,然后补齐3个字节,所以最终的结果也就是16。

    水平有限,如有错误,请大家都指出来。

    展开全文
  • 这是书上的例题,按单个字节输出。 也在考察内存是大端存储还是小端存储。 #include <stdio.h> typedef unsigned char *byte_pointer; // 声明一个字节指针 void show_bytes(byte_pointer start, int len) ...

    这两天开始看,《深入理解计算机系统》,目前的阶段我很适合看这本书。
    这是书上的例题,按单个字节输出。
    也在考察内存是大端存储还是小端存储。

    #include <stdio.h>
    
    typedef unsigned char *byte_pointer;  // 声明一个字节指针 
    
    void show_bytes(byte_pointer start, int len)
    {
    	int i = 0;
    	for (int i = 0; i < len; i++)
    	{
    		printf("%2.x",start[i]);
    	}
    	printf("\n");
    }
    void show_float(int x)
    {
    	show_bytes((byte_pointer)&x, sizeof(float));
    }
    void show_pointer(void *x)
    {
    	show_bytes((byte_pointer)&x, sizeof(void *));
    }
    void show_int(int x)
    {
    	show_bytes((byte_pointer)&x, sizeof(int));
    }
    int main()
    {
    	int val = 0x87654321;
    	byte_pointer valp = (byte_pointer)&val;
    	show_bytes(valp, sizeof(int));
    
    	system("pause");
    	return 0;
    }
    

    在这里插入图片描述

    展开全文
  • 数组在内存中所占字节数可以使用sizeof操作符来计算,该操作符是专门用于检测类型或变量...C语言中计算一个数组占内存多少空间(字节数)C语言中有一个专门用于检测类型或变量或数组在内存中所占有的空间(字节数)的操...

    数组在内存中所占字节数可以使用sizeof操作符来计算,该操作符是专门用于检测类型或变量或数组在内存中所占有的空间(字节数);语法“sizeof(x)”,其中x是类型名、变量名或数组名等,可以返回x所占字节数。

    ddcbd5ec2fdaf51992016f09caa02a41.png

    本教程操作环境:windows7系统、c99版本、Dell G3电脑。

    C语言中计算一个数组占内存多少空间(字节数)

    C语言中有一个专门用于检测类型或变量或数组在内存中所占有的空间(字节数)的操作符sizeof,用它可以直接检测出数组在内存占有的字节数。

    语法规则是:sizeof(x);

    //识别没有歧义时也可写成:

    sizeof x;

    参数:x是类型名、变量名或数组名等,

    返回值:返回x所占字节数(int型)。

    以下代码可以帮助理解:#include "stdio.h"

    struct X{

    int d;

    float t;

    double b;

    char n[100];

    };

    int main(int argc,char *argv[]){

    int a[]={1,2,3,4,5,6,7,8,9,10};

    double y=3.1415926;

    struct X t[3]={{0,0.0f,0.0,""},};//结构体数组属复杂类型

    printf("10 elements of int array needs %d bytes.\n",sizeof a);//检测整型数组

    printf("Double variables of type need %d bytes.\n",sizeof(y));//double类型变量

    printf("Type float need %d bytes.\n",sizeof(float));//float类型

    printf("Structure array 't[3]' need %d bytes.\n",sizeof t);//检测复杂类型

    return 0;

    }

    更多编程相关知识,请访问:编程教学!!

    展开全文
  • C语言编程输出不同整型数据类型在内存中占的字节数 使用sizeof(),sizeof()是保留字,它的作用是求某类型或某变量类型的字节数 代码如下: #include <stdio.h> int main() { int a = sizeof(short); int ...

    C语言编程输出不同整型数据类型在内存中占的字节数

    使用sizeof(),sizeof()是保留字,它的作用是求某类型或某变量类型的字节数

    代码如下:

    #include <stdio.h>
    int main()
    {    
        int a = sizeof(short);
        int b = sizeof(int);
        int c = sizeof(long);
        int d = sizeof(long long);
        printf("The size of short is %d bytes.\n",a);
        printf("The size of int is %d bytes.\n",b);
        printf("The size of long is %d bytes.\n",c);
        printf("The size of long long is %d bytes.\n",d);
        return 0;
    }
    
    展开全文
  • C语言-内存对齐

    2021-02-09 01:25:57
    c语言结构体的内存对齐 结构体定义 typedef struct{ int _capacity; int _size; int _element_size; void* element_arr; }Stack; sizeof输出大小,大小为24(64位机器) print("%d\n", sizeof(Stack)) int 类型...
  • C语言内存分配

    2019-08-02 05:29:56
    问题解释:分配内存后并不会输出字符串中的任何东西,释放掉内存并重新分配后字符串“貌似”与原先的一样大 解答:问题不在内存分配,而是在于字符串的操作。分配内存后,内存中的字符都是字符串的终结符,所以若...
  • C语言:内存对齐

    2019-04-23 22:32:37
    内存对齐(硬件寄存器设计的要求) *//1.前面所有成员字节数相加是当前成员的字节数的倍数,不是则补齐 *//2.整个结构体得大小要能整除最大单个成员的字节数 例子: 1. 2. 显然程序1 输出的结果为 8 2 输出...
  • C语言是如何分配地址的呢? 用下列例子进行探究。 #include #include int main() { long a=1L; long b=2L; long c=3L; printf("long存储的字节数%u bytes.",sizeof(long)); printf("\n long变量地址是...
  • C语言 变量内存地址

    2016-02-19 16:59:00
    1.内存寻址由大到小,优先分配内存地址比较大的字节给变量 2.变量越先定义,内存地址就越大 3.取得变量地址:&变量名 4.输出地址:%p 转载于:https://www.cnblogs.com/xiezefeng/p/5201579.html...
  • 这是我学习c语言中动态内存时候的一个问题,就是在free(pArr)之后,我输出的数组元素为什么会有不是乱码的值、 这下边使我测试的输出结果:为什么会有不适乱码的输出呢,释放了内存不是...
  • c语言内存原理

    2019-09-13 12:40:26
    1、内存寻址由大到小,优先分配内存地址比较大得字节给变量 2、变量越先定义,内存地址就越大 3、取得变量的地址:&变量名 4、输出地址 %p 转载于:https://...
  • 什么是字节对齐?现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问...字节是否对齐关系到CPU访问数据时的效率问题,假设一个CPU每次总是从内存中取出4个字节,从内存编号为0的地方开...
  • C语言:输入输出

    2020-12-26 22:33:01
    C语言常用的数据类型及占用内存 类型 占用内存字节) char 1 int 2 float 2 double 8 基本输入输入 用计算圆周长、面积的小例子标识输入输出 #include <stdio.h> #...
  • 写完「C语言」单链表/双向链表的建立/遍历/插入/删除后,如何将内存中的链表信息及时的保存到文件中,又能够及时的从文件中读取出来进行处理,便需要用到”文件“的相关知识点进行文件的输入、输出。其实,就算不...
  • 什么是堆内存: 是进程的一个内存段(text\data\bss\heap\stack),由程序员手动管理 特点:足够大,缺点:使用麻烦 为什么使用堆内存: ...功能:从堆内存中申请size个字节内存,申请到的内存中储存是什么内容不确
  • Android For JNI(二)——C语言中的数据类型,输出,输入函数以及操作内存地址,内存修改器 当我们把Hello World写完之后,我们就可以迈入C的大门了,今天就来讲讲基本的一些数据类型,函数之内的 我们先来看一张...
  • 程序返回内存设备的对象,pDC是设备兼容的对象(CreateCompatibleDC(pDC);需要这个参数)pwidth用于接收图片的实际宽度,pheight接收高对于返回的CDC使用bitblt来绘制,本代码是用MFC写的,如果你懂MFC那最好,注意使用完...
  • 系统存储字节为一个一个字节的存储;一般分为大端和小端的两种字节顺序,小端:低数据位存储在低地址位,大端:高数据位存储在低地址为; 上面这段代码和执行...所以此时这个数组占32个字节内存,第一个输出和...
  • C语言格式输出-------浮点型

    千次阅读 2019-11-15 21:01:17
    c语言格式输出之浮点型: c语言浮点型包含两种类型:单精度(float)、双精度(double) 二者的区别: 1)二者所占的内存大小不同。 float占用4个字节,double占用8个字节。 // VS2019 #include<stdio.h> ...
  • C语言单链表的建立和输出(详细分析)

    千次阅读 多人点赞 2019-09-18 18:04:48
    C语言单链表的建立和输出(详细分析) 1、头文件 #include<stdio.h> #include<stdlib.h>//包含了malloc函数,可以用malloc.h代替 C语言中malloc是动态内存分配函数 函数原型:void * malloc(unsigned ...
  • C语言当中所有变量本质都是一个地址。 1. int nNum = 'XXOO'; printf_s("%s", &nNum); 看到上面的例子没有,int变量怎么可以存字符呢,但是确实可以。通过把字符存到整形变量里面,再用字符串的形式输出。...
  • 字节相互交换后输出,试用共用体类型实现这一功能。 实现代码:原理就不讲了,下来翻书好不好~( ̄▽ ̄)~*涅。 /*还是大概讲一下,大概就是共用体内,内存是一起用的,详解百度娘*/ 代码详解: #include&...
  • C语言

    2016-05-01 10:42:55
    C语言 1、printf("格式控制字符...3、malloc(unsigned int a)向系统申请a字节内存块空间。 4、realloc()可以重新更改malloc()已分配的内存空间大小; 5、calloc(a)在动态存储区分配a个长度size的连续空间,在分配完
  • 缺省情况下,C/C++编译器默认将结构、栈中的成员数据进行内存对齐。因此,引言程序输出就变成"c1 -> 0, s -> 2, c2 -> 4, i -> 8"。 编译器将未对齐的成员向后移,将每一个都成员对齐到自然边界上,...
  • 内存寻址由大到小,优先分配内存地址比较大的字节给变量 2.变量越先定义,内存地址就越大 3.取得变量的地址:&变量名 4.输出地址:%p 5.一个变量一定先进行初始化,才能使用 */ int main() { // 内存寻址...
  • C文件概述文件是指一组相关数据的有序集合。这个数据集有一个名称,叫做文件名。...二进制文件形式:把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。优点:可以节省外存空间和转换...
  • 值得注意的是,使用scanf语句输入字符串时,即使输入的字节数超过申请的长度,编译器也不会发出任何警报或错误提示,但是这些字符会被接受并存储在内存中,造成程序隐患; scanf语句中不能输入空白字符,如果有空白
  • 通过C程序,输出变量在内存中存储的每个字节的内容极其地址。 %p 十六进制,大写,高位零显示 %x 十六进制,小写,高位0不显示 代码 通过指针访问内存 #include<stdio.h> #include<stdlib.h> typedef ...
  • 数据要使用首先要放到内存中,内存中是由上亿个小元器件构成,每个小元器件就是一段小电路,它的通断代表着1和0,也就是一位也叫做1bit(比特),我们把8个比特放一起称做1byte(字节)。字节是计算机存储的最小单位。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 455
精华内容 182
关键字:

c语言输出内存字节

c语言 订阅