c语言结构体(结构体数组作为函数参数|数组在堆内存创建)(代码片段)

韩曙亮 韩曙亮     2023-02-19     183

关键词:





一、结构体 数组 作为函数参数 ( 数组 在 堆内存创建 )



在上一篇博客 【C 语言】结构体 ( 结构体 数组 作为函数参数 | 数组 在 栈内存创建 ) 的基础上 , 将 栈内存 中的 结构体数组 , 更改为 堆内存 中创建结构体数组 ;

在堆内存中 , 创建 结构体数组 : 传入 二级指针 , 该指针 指向 结构体 指针 , 传入 二级指针 的目的是 , 可以在函数中 , 通过形参 间接赋值 , 达到返回创建堆内存的目的 ;

/**
 * @brief create_student 堆内存中分配内存
 * @param array 二级指针 , 指向结构体数组
 * @return
 */
int create_student(Student **array, int count)

    // 返回值
    int ret = 0;
    // 临时变量
    Student *tmp = NULL;

    // 验证二级指针合法性
    if(array == NULL)
    
        ret = -1;
        return ret;
    

    // 堆内存中申请内存
    tmp = (Student *)malloc(sizeof(Student) * count);

    // 通过间接赋值 设置返回值
    *array = tmp;

    return ret;

释放堆内存中的 结构体 数组 : 传入的参数是 二级指针 , 通过该 二级指针 指向 结构体一级指针 , 将 结构体指针 置空 ;

/**
 * @brief free_student 释放内存
 * @param array
 * @return
 */
int free_student(Student **array)

    // 返回值
    int ret = 0;

    // 验证二级指针合法性
    if(array == NULL)
    
        ret = -1;
        return ret;
    

    // 释放内存
    free(*array);

    // 指针置空 , 防止野指针
    *array = NULL;

    return ret;





二、完整代码示例



完整代码示例 :

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

/**
 * @brief The Student struct
 * 定义 结构体 数据类型 , 同时为该结构体类型声明 别名
 * 可以直接使用 别名 结构体变量名 声明结构体类型变量
 * 不需要在前面添加 struct 关键字
 */
typedef struct Student

    char name[5];
    int age;
    int id;
Student;

/**
 * @brief printf_struct_array 打印结构体数组
 * @param array 数组作为函数参数退化为指针
 * @param count 数组中的元素个数
 */
void printf_struct_array(Student *array, int count)

    // 循环控制变量
    int i = 0;

    // 验证数组合法性
    if(array == NULL)
    
        return;
    

    // 打印结构体数组中的 结构体 age 字段
    for(i = 0; i < count; i++)
    
        printf("Student age = %d\\n", array[i].age);
    


/**
 * @brief sort_struct_array 对结构体数组 按照年龄进行排序
 * @param array 结构体指针
 * @param count 结构体数组的元素个数
 */
void sort_struct_array(Student *array, int count)

    // 循环控制变量
    int i = 0, j = 0;
    // 学生年龄
    Student tmp;

    // 验证数组合法性
    if(array == NULL)
    
        return;
    

    // 排序
    for(i = 0; i < count; i++)
    
        for(j = i + 1; j < count; j++)
        
            if(array[i].age > array[j].age)
            
                tmp = array[i];
                array[i] = array[j];
                array[j] = tmp;
            
        
    


/**
 * @brief create_student 堆内存中分配内存
 * @param array 二级指针 , 指向结构体数组
 * @return
 */
int create_student(Student **array, int count)

    // 返回值
    int ret = 0;
    // 临时变量
    Student *tmp = NULL;

    // 验证二级指针合法性
    if(array == NULL)
    
        ret = -1;
        return ret;
    

    // 堆内存中申请内存
    tmp = (Student *)malloc(sizeof(Student) * count);

    // 通过间接赋值 设置返回值
    *array = tmp;

    return ret;


/**
 * @brief free_student 释放内存
 * @param array
 * @return
 */
int free_student(Student **array)

    // 返回值
    int ret = 0;

    // 验证二级指针合法性
    if(array == NULL)
    
        ret = -1;
        return ret;
    

    // 释放内存
    free(*array);

    // 指针置空 , 防止野指针
    *array = NULL;

    return ret;



/**
 * @brief 主函数入口
 * @return
 */
int main(int argc, char* argv[], char**env)


    // 声明结构体数组 , 该数组在栈内存中
    Student *array = NULL;
    // 循环控制变量
    int i = 0;

    // 堆内存中为结构体指针分配内存
    create_student(&array, 3);

    // 命令行中 , 接收输入的年龄
    for(i = 0; i < 3; i++)
    
        printf("\\n Input Age :\\n");
        // 命令换行中 接收 输入的年龄 ,
        // 设置到 Student 数组元素的 age 成员中
        scanf("%d", &(array[i].age));
    

    // 结构体数组 按照 age 排序
    sort_struct_array(array, 3);

    // 打印结构体数组中的 结构体 age 字段
    printf_struct_array(array, 3);

    // 释放堆内存数据
    free_student(&array);

    // 命令行不要退出
    system("pause");
    return 0;


执行结果 :


 Input Age :
12

 Input Age :
11

 Input Age :
14
Student age = 11
Student age = 12
Student age = 14
请按任意键继续. . .

c基础结构体(代码片段)

目录一、结构体struct的定义和.操作符的使用二、结构体的创建和初始化三、结构体的内存对齐模式3.1结构体强转其他类型四、指定结构体元素的位字段(bit)五、结构数组5.1结构体数组的冒泡排序六、结构体嵌套七、结构体的赋值... 查看详情

c语言结构体(结构体作为函数参数|结构体指针作为函数参数)(代码片段)

文章目录一、结构体作为函数参数二、结构体指针作为函数参数三、完整代码示例一、结构体作为函数参数结构体变量作为函数形参,在函数中,只能访问该函数形参,无法修改结构体内存的值;结构体变量通过形参形式传入,会在该p... 查看详情

c语言中返回结构体数组

再另一个子函数中还可以将更改了的结构体数组调用参考技术A结构体名*函数名(参数列表)return(结构体数组首地址);追问那引用的时候呢,形参还是数组首地址么?可是貌似不管用? 参考技术B用指针传递 查看详情

go语言基础函数,数组,指针,结构体(代码片段)

...回值为什么闭包不会被垃圾回收defer内置函数panic、recover语言变量作用域数组数组定义数组+函数+宏定义二维数组指针make和new的区别二级指针的使用空指针指针数组将指针传入函数进行值的交换结构体自定义类型和类型别... 查看详情

c语言如何给结构体指针赋值?

错误(活动) E0513 不能将"constchar*"类型的值分配到"char*"类型的实体 这个咋搞??结构体数组指针作为函数参数,通过数组的首地址与偏移量对结构体数组进行scanf的赋值,在函数中通过指针间接访问到其指向的内... 查看详情

c语言-结构体(代码片段)

结构体结构体类型数据的定义和引用方法一.结构体类型的概念定义结构体变量定义结构体类型变量的方法引用结构体成员成员引用引用结构体数据成员的方法整体引用初始化结构体变量结构体嵌套和用指针引用结构体成员指向... 查看详情

c语言中的结构体,结构体数组

 C语言中的结构体是一个小难点,下面我们详细来讲一下:至于什么是结构体,结构体为什么会产生,我就不说了,原因很简单,但是要注意到是结构体也是连续存储的,但要注意的是结构体里面类型各异,所以必然会产生... 查看详情

c语言里面的结构体是啥意思

...类型或不同类型的数据构成的数据集合,叫做结构。在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregatedatatype)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体... 查看详情

go语言基础函数,数组,指针,结构体(代码片段)

...回值为什么闭包不会被垃圾回收defer内置函数panic、recover语言变量作用域数组数组定义数组+函数+宏定义二维数组指针make和new的区别二级指针的使用空指针指针数组将指针传入函数进行值的交换结构体自定义类型和类型别... 查看详情

结构体数组怎么做函数参数

定义了一个结构体数组STUDENTstudent[200];如何用作函数参数如:voidLabel();函数里面要对数组的元素student[i].元素做操作怎么实现小白求高手详解括号中加入STUDENTgh[]首先要在主函数前定义voidLabel(STUDENT*[])但在STUDENT定义之后引用时L... 查看详情

c++入门基础教程:c语言的指针与结构体到底怎么用?(代码片段)

目录一、前言二、指针2.1指针与地址2.2指针与函数参数2.3指针与数组2.3.1指针与一维数组2.3.2 指针与二维数组2.4 字符指针与函数2.5 指针数组以及指向指针的指针2.5.1指针数组2.5.2指向指针的指针2.6 指向函数的指针三、结构体3.... 查看详情

20160221.ccpp体系详解(0031天)

...nclude<stdio.h>#include<stdlib.h>#include<string.h>//01.C语言的结构体特点://1.C语言要求结构体或者共用体至少得有一个成员//也就是说C语言并不允许空结构体或者空共用体的出现!//2.严格区分采用结构体类型到底定义的是哪种... 查看详情

c语言数据类型——结构体(代码片段)

文章目录1结构体1.1结构类型变量的说明1.2结构类型变量的说明1.3结构类型变量的赋值1.4结构变量的初始化1.5结构数组的定义1.6结构指针变量的说明和使用1.6.1指向结构变量的指针1.6.2指向结构数组的指针1.6.3结构指针变量作为函... 查看详情

c++基础3(函数指针结构体)(代码片段)

...针const修饰指针指针和数组指针和函数指针、数组、函数结构体结构体基本概念结构体定义和使用结构体数组结构体指针结构体嵌套结构体结构体做函数参数结构体中const使用场景结构体案例案例1案例2函数函数的定义函数的定义... 查看详情

c语言结构和联合(代码片段)

自定义类型结构体结构体基础知识结构体指针结构体的内存分配位段联合结构体结构体基础知识结构体和数组的差别创建一个结构体structstudent//学生的数据类型 charname[10]; intage;;也可以创建结构体指针和结构体数组structstudent*p;//... 查看详情

c语言学习笔记整理(代码片段)

C语言学习笔记整理一.数据在内存中的存储1.1数据类型介绍1.2整形在内存中的存储1.3大小端字节序介绍1.4浮点型在内存中的存储解析二.指针详细介绍2.1字符指针2.2指针数组2.3数组指针2.4数组传参和指针传参2.5函数指针2.6函数指针... 查看详情

☀️c语言函数传参の结构体数组篇☀️(代码片段)

背景介绍C语言中函数参数传递的两种方式(“引用传递做函数参数”是C++的特性,C语言不支持。)(1)传值,就是把你的变量的值传递给函数的形式参数,实际就是用变量的值来新生成一个形... 查看详情

☀️c语言函数传参の结构体数组篇☀️(代码片段)

背景介绍C语言中函数参数传递的两种方式(“引用传递做函数参数”是C++的特性,C语言不支持。)(1)传值,就是把你的变量的值传递给函数的形式参数,实际就是用变量的值来新生成一个形... 查看详情