实验验证C语言中结构体与共用体的差异

简介: 实验验证C语言中结构体与共用体的差异


一、引言


在C语言编程中,结构体(struct)和共用体(union)是两种重要的复合数据类型,它们允许程序员将多个不同类型的数据组合成一个单一的数据类型。然而,尽管两者在形式上有些相似,但它们在内存中的表示和用途上却有着显著的区别。本文将通过实验的方式,深入探究结构体和共用体在C语言中的差异,并通过代码示例进行验证。


二、结构体(struct)


结构体是一种复合数据类型,它允许我们在一个变量中存储不同的数据类型。结构体中的每个元素(也称为成员)可以是不同类型的数据,它们通过结构体名来访问。结构体在内存中占据的是所有成员变量大小的总和,并且每个成员在内存中是连续存储的。

下面是一个简单的结构体示例代码:

#include <stdio.h>
// 定义一个结构体
typedef struct {
    int id;
    char name[50];
    float score;
} Student;
int main() {
    // 声明一个结构体变量
    Student stu = {1, "Tom", 90.5};
    // 访问结构体成员
    printf("ID: %d, Name: %s, Score: %.1f\n", stu.id, stu.name, stu.score);
    return 0;
}

在这个示例中,我们定义了一个名为Student的结构体,它包含了三个成员:id(整型)、name(字符数组)和score(浮点型)。然后,我们声明了一个Student类型的变量stu,并初始化了它的成员。最后,我们通过结构体变量名加上点操作符(.)来访问结构体的成员。


三、共用体(union)


共用体也是一种复合数据类型,它允许我们在一个变量中存储不同的数据类型。然而,与结构体不同的是,共用体中的所有成员共享同一块内存空间。这意味着,当我们在共用体中存储一个值时,它将覆盖该内存块中之前的值。共用体在内存中的大小是其成员中最大数据类型的大小。

下面是一个简单的共用体示例代码:

#include <stdio.h>
// 定义一个共用体
typedef union {
    int i;
    float f;
    char str[20];
} Data;
int main() {
    // 声明一个共用体变量
    Data data;
 
    // 存储整数
    data.i = 10;
    printf("Integer: %d\n", data.i);
    // 存储浮点数(覆盖之前的整数)
    data.f = 220.5;
    printf("Float: %.1f\n", data.f);
    // 存储字符串(覆盖之前的浮点数)
    strcpy(data.str, "Hello");
    printf("String: %s\n", data.str);
    // 注意:此时尝试访问 data.i 或 data.f 将得到未定义的结果
    return 0;
}

在这个示例中,我们定义了一个名为Data的共用体,它包含了三个成员:i(整型)、f(浮点型)和str(字符数组)。然后,我们声明了一个Data类型的变量data,并依次存储了整数、浮点数和字符串。由于共用体的特性,当我们存储一个新的值时,它将覆盖该内存块中之前的值。因此,在存储字符串之后,我们不能再通过data.i或data.f来访问之前的整数或浮点数了。


四、实验验证


为了更直观地展示结构体和共用体在内存中的差异,我们可以使用C语言中的指针和内存操作函数来进行实验验证。

首先,我们定义一个结构体和一个共用体,并声明相应的变量。然后,我们打印出这些变量在内存中的地址和大小。接下来,我们使用指针和内存操作函数来查看这些变量在内存中的具体内容。

以下是实验验证的代码示例:

#include <stdio.h>
#include <string.h>
// 定义结构体和共用体
typedef struct {
    int id;
    char name[50];
    float score;
} Student;
typedef union {
    int i;
    float f;
    char str[20];
} Data;
int main() {
    // 声明变量
    Student stu = {1, "Tom", 90.5};
    Data data;
    // 打印变量地址和大小
    printf("Student stu address: %p, size: %zu\n", &stu, sizeof(stu));
    printf("Data data address: %p, size: %zu\n", &data, sizeof(data));
    // 验证结构体内存布局
    printf("stu.id address: %p, value: %d\n", &(stu.id), stu.id);
    printf("stu.name address: %p, value: %s\n", stu.name, stu.name);
    printf("stu.score address: %p, value: %.1f\n", &(stu.score), stu.score);
    // 验证共用体内存布局(仅展示一种成员)
    data.i = 10;
    printf("data.i address: %p, value: %d\n", &(data.i), data.i);
    // 注意:由于共用体的特性,我们不能同时查看多个成员的内容
    return 0;
}

通过运行这段代码,我们可以清晰地看到结构体和共用体在内存中的地址和大小差异。同时,通过打印结构体和共用体成员的地址和内容,我们可以验证它们在内存中的存储方式。实验结果将直观地展示结构体成员在内存中是连续存储的,而共用体成员则共享同一块内存空间。

相关文章
|
26天前
|
存储 C语言
如何在 C 语言中实现结构体的深拷贝
在C语言中实现结构体的深拷贝,需要手动分配内存并逐个复制成员变量,确保新结构体与原结构体完全独立,避免浅拷贝导致的数据共享问题。具体方法包括使用 `malloc` 分配内存和 `memcpy` 或手动赋值。
34 10
|
25天前
|
存储 大数据 编译器
C语言:结构体对齐规则
C语言中,结构体对齐规则是指编译器为了提高数据访问效率,会根据成员变量的类型对结构体中的成员进行内存对齐。通常遵循编译器默认的对齐方式或使用特定的对齐指令来优化结构体布局,以减少内存浪费并提升性能。
|
30天前
|
编译器 C语言
共用体和结构体在 C 语言中的优先级是怎样的
在C语言中,共用体(union)和结构体(struct)的优先级相同,它们都是用户自定义的数据类型,用于组合不同类型的数据。但是,共用体中的所有成员共享同一段内存,而结构体中的成员各自占用独立的内存空间。
|
30天前
|
存储 C语言
C语言:结构体与共用体的区别
C语言中,结构体(struct)和共用体(union)都用于组合不同类型的数据,但使用方式不同。结构体为每个成员分配独立的内存空间,而共用体的所有成员共享同一段内存,节省空间但需谨慎使用。
|
1月前
|
编译器 C语言 C++
C语言结构体
C语言结构体
27 5
|
1月前
|
C语言
大学生期末C语言实验(学生成绩和鞍点)
大学生期末C语言实验(学生成绩和鞍点)
157 0
大学生期末C语言实验(学生成绩和鞍点)
|
1月前
|
编译器 Linux C语言
C语言 之 结构体超详细总结
C语言 之 结构体超详细总结
20 0
|
1月前
|
存储 编译器 Linux
深入C语言:探索结构体的奥秘
深入C语言:探索结构体的奥秘
|
1月前
|
存储 编译器 C语言
c语言回顾-结构体(2)(下)
c语言回顾-结构体(2)(下)
30 0
|
1月前
|
存储 编译器 程序员
c语言回顾-结构体(2)(上)
c语言回顾-结构体(2)(上)
29 0