服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言结构体计算内存占用问题解析

C语言结构体计算内存占用问题解析

2021-11-21 16:06luffy5459 C/C++

这篇文章主要介绍了C语言结构体计算内存占用问题解析,本文通过案例来解析了C语言计算结构体内存的方式和方法,需要的朋友可以参考下

    c语言中结构体使用是非常广泛的,但是结构体有一个问题,就是如果开头的字段属性是字符类型(char),紧跟着的是其他类型,比如整型、长整型、双精度、浮点型,这时候结构体的大小会发生改变,下面给出一个示例:

?
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
struct person{
  char sex;
  int age;
  char name[8];
};
int main()
{
  printf("sizeof(person) = %d\n",sizeof(struct person));
  return 0;
}

    这个示例很简单,就是定义一个结构体,三个属性:分别是char类型的sex,int类型的age,char[]类型的name,直观的看,大小应该是1+4+8=13,但是我们编译,运行,结果如下所示:

?
1
2
3
# clang hello.c -o hello
# ./hello
sizeof(person) = 16

    开始的char并不会被分配1byte,而是4byte,是为了和相近的int对齐,这就是c语言结构体的内存对齐的具体表现,在linux下,可以通过增加__attribute__((__packed__))在结构体声明的地方,修改上述代码,如下所示:

C语言结构体计算内存占用问题解析

    程序运行,最终的打印结果是13,符合我们原来的预期。 

    还有一种修改办法,就是指定字段对齐大小为1,如下所示:

C语言结构体计算内存占用问题解析

    这两种办法,好像只有在linux下才会生效,在windows下这种办法会报语法错误。

到此这篇关于C语言结构体计算内存占用问题解析的文章就介绍到这了,更多相关C语言结构体内存占用内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/feinifi/article/details/115606739

延伸 · 阅读

精彩推荐