C语言 结构体struct

C语言中,数组允许定义可存储相同类型数据项的变量,结构是 C 编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项,因此C语言中的struct可以看作变量的集合。

struct的问题:空结构体占用多大的内存?sizeof(struct TS)=?

struct TS
{

};

示例:空结构体的大小

#include <stdio.h>

struct TS
{

};

int main()
{
    struct TS t1;
    struct TS t2;

    printf("sizeof(struct TS) = %d\n", sizeof(struct TS));
    printf("sizeof(t1) = %d, &t1 = %p\n", sizeof(t1), &t1);
    printf("sizeof(t2) = %d, &t2 = %p\n", sizeof(t2), &t2);

    return 0;
}

输出结果:

空结构体的大小

可以看出在gcc编译器下,空结构体的size为0,可以正常运行。不过在bcc编译器下会编译错误。

结构体与柔性数组

柔性数组即数组大小待定的数组,C语言中可以由结构体产生柔性数组,C语言中结构体的最后一个元素可以是大小未知的数组。

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

SoftArray中的array仅是一个待使用的标识符,不占用存储空间。

sizeof(struct SoftArray)的结果为4。下面的例子,编译会报错:

#include <stdio.h>

struct TS
{
    int len;
    int array[];
    int len2;
};

int main()
{
    struct TS t1;
    struct TS t2;

    printf("sizeof(struct TS) = %d\n", sizeof(struct TS));
    printf("sizeof(t1) = %d, &t1 = %p\n", sizeof(t1), &t1);
    printf("sizeof(t2) = %d, &t2 = %p\n", sizeof(t2), &t2);

    return 0;
}

编译结果:

柔性数组

柔性数组的用法

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

struct SoftArray *sa = NULL;
sa = (struct SoftArray*)malloc(sizeof(struct SoftArray) + sizeof(int) * 5);
sa->len = 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;
}

运行结果:

柔性数组的使用分析

赞(1)
未经允许不得转载:极客笔记 » C语言 结构体struct
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址