深入理解C语言结构体成员变量内存分配

简介: 深入理解C语言结构体成员变量内存分配


1 问题描述

在学习C语言的时候,我们都会频繁的接触到结构体,使用结构体定义新的数据类型,从而更加方便的存储数据。但是在使用结构体的时候,有些问题会经常会困扰我们,如下所示:


第一种结构体定义:

struct school{

   char address[100];

   char name[30];

};


第二种结构体定义:

struct school_other{

   char *address;

   char *name;

};

以上两种结构体的定义有什么区别?我们在使用的时候需要注意什么?


本文将和大家一起来深入的探讨这个问题。


2 分析问题

很多时候对于大家来说,最重要的不是得到问题的答案,而是学会别人是如何分析问题的,这种解决问题的思路对于大家来说才是最重要的,也是最精彩的地方。


C语言中定义的任何一个变量,最终都会从你的内存条上拿走相应的内存空间,如定义了一个int a;那么四个字节的空间就给a这个变量了。既然如此,我们很好奇,上述两种类型的结构体,分别占用了多大的内存空间呢?为了解决这个问题,我们编写了以下的程序:

这个程序应该很简单,相信各位同学都能看懂,首先定义了两个结构体类型struct school和struct school_other,然后在main函数中定义了两个变量,最后使用sizeof()函数获得变量的内存空间大小。


程序的输出结果如下:


这种输出结果不知是大家意料之中还是意料之外呢?无论是哪种情况,我们一起来分析分析。


如果要我们去计算第一个结构体的内存占用空间,你该如何去计算?

struct school{

   char address[100];

   char name[30];

};


由于sizeof(char)==1得到每一个字符型数据占用的空间大小是一个字节,因此上述结构体占用的空间应该是:1 Byte * 100 + 1 Byte * 30 = 130 Byte,这个答案和输出的结果是一致的。


按照同样的方式我们去计算另外一个结构体的内存占用空间:

struct school_other{

   char *address;

   char *name;

};


由于sizeof(char *) == 8得到每一个指针类型的数据占用的空间是八个字节,因此上述结构体占用的空间应该是:8 Byte * 1 + 8 Byte * 1 = 16 Byte,这个答案也和输出结果一致。


为什么要花这么多的篇幅去介绍结构体类型空间大小呢?

貌似和主题无关,其实正是深入理解主题的核心所在。本文定义一个school结构体的目的在于通过school结构体能够保存某个学校的地址和名称,而地址和名称都是字符数组类型,这种类型可以保存多个字符。

struct school这种结构体类型为其成员变量address和name分配了大小分别为100和30的内存空间,有了内存空间,因此可以直接使用。


而struct school_other这种结构体类型并没有为其成员变量分配内存空间,因此在使用之前必须对其分配,才可以为其赋值。


上述问题,其实可以进一步简化成:

char address[100];

char* address_other;


这两种变量大家在使用时,应该注意什么?


address变量已经有了100个字节的内存空间,因此可以直接对其进行赋值,而address_other只是一个指针即只是一个内存地址,而这个地址是多少并未知晓,因此在使用之前,务必要分配内存空间,然后才能使用。


3 总结

本文介绍了结构体指针类型的成员变量和数组类型的成员变量的区别,以及在使用时应该注意的问题,帮助大家更好的理解内存分配。

目录
相关文章
|
22天前
|
存储 编译器 程序员
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
在C语言中,内存布局是程序运行时非常重要的概念。内存布局直接影响程序的性能、稳定性和安全性。理解C程序的内存布局,有助于编写更高效和可靠的代码。本文将详细介绍C程序的内存布局,包括代码段、数据段、堆、栈等部分,并提供相关的示例和应用。
35 5
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
|
18天前
|
存储 网络协议 编译器
【C语言】深入解析C语言结构体:定义、声明与高级应用实践
通过根据需求合理选择结构体定义和声明的放置位置,并灵活结合动态内存分配、内存优化和数据结构设计,可以显著提高代码的可维护性和运行效率。在实际开发中,建议遵循以下原则: - **模块化设计**:尽可能封装实现细节,减少模块间的耦合。 - **内存管理**:明确动态分配与释放的责任,防止资源泄漏。 - **优化顺序**:合理排列结构体成员以减少内存占用。
91 14
|
22天前
|
存储 编译器 C语言
【C语言】结构体详解 -《探索C语言的 “小宇宙” 》
结构体通过`struct`关键字定义。定义结构体时,需要指定结构体的名称以及结构体内部的成员变量。
100 10
|
22天前
|
存储 缓存 算法
【C语言】内存管理函数详细讲解
在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
50 6
|
26天前
|
传感器 人工智能 物联网
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
42 6
|
26天前
|
存储 数据建模 程序员
C 语言结构体 —— 数据封装的利器
C语言结构体是一种用户自定义的数据类型,用于将不同类型的数据组合在一起,形成一个整体。它支持数据封装,便于管理和传递复杂数据,是程序设计中的重要工具。
|
1月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
110 13
|
26天前
|
大数据 C语言
C 语言动态内存分配 —— 灵活掌控内存资源
C语言动态内存分配使程序在运行时灵活管理内存资源,通过malloc、calloc、realloc和free等函数实现内存的申请与释放,提高内存使用效率,适应不同应用场景需求。
|
1月前
|
存储 编译器 数据处理
C 语言结构体与位域:高效数据组织与内存优化
C语言中的结构体与位域是实现高效数据组织和内存优化的重要工具。结构体允许将不同类型的数据组合成一个整体,而位域则进一步允许对结构体成员的位进行精细控制,以节省内存空间。两者结合使用,可在嵌入式系统等资源受限环境中发挥巨大作用。
60 11
|
26天前
|
存储 算法 程序员
C 语言指针详解 —— 内存操控的魔法棒
《C 语言指针详解》深入浅出地讲解了指针的概念、使用方法及其在内存操作中的重要作用,被誉为程序员手中的“内存操控魔法棒”。本书适合C语言初学者及希望深化理解指针机制的开发者阅读。