C/CPP

为何C语言函数可以返回struct

struct可由多个数据类型构成,初步看起来应该类似数组,变量本身是一个指向首字节的指针,无法直接通过此指针赋值struct,在函数中声明为自动变量时,也无法返回此指针所指向的值。

但事实上就并非如此,struct之间可以直接赋值,使用指针指向其地址时需要使用”&”,函数中声明为自动变量时可以直接return其值。

那struct变量本身到底是何?

写了这样一个东西,运行后瞬间明白:

#include <stdio.h>
#include <string.h>

struct my_struct {
    unsigned char ch1;
    unsigned char ch2;
    unsigned char ch3;
    unsigned char ch4;
};

int main()
{
    struct my_struct struct1;
    memset(&struct1, 0, sizeof(struct my_struct));
    printf("%u\n", struct1);
    struct1.ch1 = 0xFF;
    printf("%u\n", struct1);
    struct1.ch2 = 0xFF;
    printf("%u\n", struct1);
    struct1.ch3 = 0xFF;
    printf("%u\n", struct1);
    struct1.ch4 = 0xFF;
    printf("%u\n", struct1);
    return 0;
}

struct变量就和基本类型,int, char等一样,直接指向其值,而且struct有多少字节,那个值就有多少字节。

也就是说,我们声明一个struct类型时,就是的的确确等于声明了一个确定大小的类型,就和int, char等基本类型一致。

既然是指向值,有确定大小,而且不是地址,那么就可以解释为何可以直接赋值以及可以被函数return了。

 

返回数组:

#include <stdio.h>

struct size_struct {
    int num_array[100];
};

struct size_struct return_a_array();

int main(void) {
    struct size_struct my_struct;
    int * const my_array = &my_struct;
    my_struct = return_a_array();
    for (int i = 0; i < 100; i++)
        printf("%d\n", my_array[i]);
    return 0;
}

struct size_struct return_a_array() {
    struct size_struct my_struct;
    int * const my_array = &my_struct;
    for (int i = 0; i < 100; i++)
        my_array[i] = i;
    return my_struct;
}

 

102 Posts

自信、努力、活出精彩;以前未所见的颜色,绘大千世界!
View all posts

1 thought on “为何C语言函数可以返回struct”

Leave a reply

Your email address will not be published. Required fields are marked *