C基础第10课 struct 和 union 分析

学习自狄泰软件学院唐佐临老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。


实验1 ~3 :不同的编译器对空结构体的规定不一样 gcc编译器允许空结构体存在,并且占用空间为0,而bcc 以及 vc 编译器不允许定义空结构体,他们认为空结构体没有意义。

实验4 柔型数组的大小是0
实验5 柔型数组的使用
实验6 通过联合体 union 判断系统的大小端


在这里插入图片描述

实验1 :gcc 编译器环境
gcc 编译器环境空结构体以及空结构体所定义的变量占用的内存大小都为0
在这里插入图片描述

实验2 :bcc 编译器环境
bcc编译器不允许空结构体的存在
在这里插入图片描述

实验3 : vc编译器环境

vc编译器环境也是不允许空结构体存在的

在这里插入图片描述

在这里插入图片描述

实验4 柔型数组的大小是0

在这里插入图片描述

在这里插入图片描述

实验5 柔型数组的使用

#include <stdio.h>
#include <malloc.h>

struct SoftArray
{
    int len;
    int array[];
};

struct SoftArray* create_soft_array(int size)
{
    struct SoftArray* ret = NULL;
    
    if( size > 0 )
    {
        ret = (struct SoftArray*)malloc(sizeof(struct SoftArray) + sizeof(int) * size);
        
        ret->len = size;
    }
    
    return ret;
}

void delete_soft_array(struct SoftArray* sa)
{
    free(sa);
}

void func(struct SoftArray* sa)
{
    int i = 0;
    
    if( NULL != sa )
    {
        for(i=0; i<sa->len; i++)
        {
            sa->array[i] = i + 1;
        }
    } 
}

int main()
{
    int i = 0;
    struct SoftArray* sa = create_soft_array(10);
    
    func(sa);
    
    for(i=0; i<sa->len; i++)
    {
        printf("%d\n", sa->array[i]);
    }
    
    delete_soft_array(sa);
    
    return 0;
}


mhr@ubuntu:~/work/C$ 
mhr@ubuntu:~/work/C$ 
mhr@ubuntu:~/work/C$ gcc test1.c 
mhr@ubuntu:~/work/C$ 
mhr@ubuntu:~/work/C$ ./a.out 
1
2
3
4
5
6
7
8
9
10
mhr@ubuntu:~/work/C$ 
mhr@ubuntu:~/work/C$ 

在这里插入图片描述

在这里插入图片描述
如果在小端模式的系统 打印会输出 1,1会在低地址存储低位空间,这个时候 c 这个成员变量只占用一个字节,显然 c 占用了联合体低地址的一个存储的空间,故输出 1

如果在大端模式的系统 打印会输出 0,因为1存储在高地址的存储空间,存储结构如上图

不管系统的大小端模式是大端还是小端,我们这个联合体的成员变量c都是取 低地址空间数据,c是从内存的低地址上取数据。

实验6 : 判断系统的大小端

在这里插入图片描述

输出为1,说明1存储在最大存储空间的低位,所以我们的系统是小端模式。

在这里插入图片描述

发布了192 篇原创文章 · 获赞 100 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/LinuxArmbiggod/article/details/103552175