美文网首页
深度学习在设备中做interfere时的利器 | 没错就是结构体

深度学习在设备中做interfere时的利器 | 没错就是结构体

作者: yuanCruise | 来源:发表于2019-07-06 20:02 被阅读0次

    之所以使用结构体,我个人认为,由于结构体能将不同类型数据组成整体,方便数据保存和使用。且结构体的定义是:有些数据既是相互关联的,又共同描述一个完整事物,如:一个学生的整体信息,学号、姓名、性别等。而我们做算法推理时,会涉及很多不同类型的参数,以及通常在复杂的网络中,参数们又自成一派。因此,结构体正好派上用场。所以本文简单介绍下,结构体的基础属性。

    1.结构体的定义与内存分配

    如下代码所示,定义了一个结构体数据类型,所谓数据类型就是固定大小内存块的别名,所以此时还没进行内存分配。

        //定义了一个数据类型 。固定大小内存块的别名 还没有分配内存
    
        typedef struct Teacher
        {
            char name[64];
            int age ;
            int id;
        }Teacher;
    

    只有用结构体数据类型定义结构体类型变量的时候,编译器才会分配内存。如下所示,是两种为结构体分配内存的方式。一种是分配在栈内存上,另一种则是分配在堆内存上。

        //如下语句编译器就会分配内存在栈内存上
        Teacher  t1; 
        Teacher  t2 = {"aaaa", 32, 02};
        Teacher  Array[3]; //定义三个结构体,分配三倍的栈内存空间。
    
        //如下语句编译器就会分配内存在堆空间上
        Teacher *pArray = NULL;
        pArray = createTeacher(3);//在堆内存中分配3个结构体内存
        
        Teacher * createTeacher(int num)
        {
            Teacher * tmp = NULL;
            tmp = (Teacher *)malloc(sizeof(Teacher) * num); //  same Teacher Array[3]
            if (tmp == NULL)
            {
                return NULL;
            }
            return tmp; 
    
        }
    
    2.结构体做函数参数

    正常在较为庞大的工程中,我们会很注意我们对内存的使用,因为一不小心就会因内存溢出而导致程序崩溃。因此我们通常集中分配内存,统一管理。所以本例中利用单独在堆空间分配内存为例阐述。

    #include <string.h>
    #include <stdio.h>
    
    typedef struct Teacher
    {
        char name[64];
        int age ;
        int id;
    }Teacher;
    
    void printTeacher(Teacher *array, int num)
    {
        int i = 0;
        for (i=0; i<num; i++)
        {
            printf("age:%d \n", array[i].age);
        }
    }
    
    void sortTeacer(Teacher *array, int num)
    {
        int     i,j;
        Teacher tmp;
        for (i=0; i<num; i++)
        {
            for (j=i+1; j<num; j++)
            {
                if (array[i].age > array[j].age)
                {
                  // 相当于对指针指向的位置的元素进行交换了,所以交换结果可以带出函数
                    tmp = array[i];  //=号操作  赋值操作
                    array[i] = array[j];
                    array[j] = tmp;
                }
            }
        }
    }
    
    
    Teacher * createTeacher(int num)
    {
        Teacher * tmp = NULL;
        tmp = (Teacher *)malloc(sizeof(Teacher) * num); //  Teacher     Array[3]
        if (tmp == NULL)
        {
            return NULL;
        }
        return tmp; 
    }
    
    
    void FreeTeacher(Teacher *p)
    {
        if (p != NULL)
        {
            free(p);
        }
    }
    
    
    void main()
    {
        int         i = 0;
        //Teacher   Array[3];        //在stack 分配内存
        int         num = 3;
        Teacher *pArray = NULL;
        pArray = createTeacher(num); //在heap 分配内存
    
        for (i=0; i<num; i++)
        {
            printf("\nplease enter age:");
            scanf("%d", & (pArray[i].age) );// C语言古典语法
        }
    
        printTeacher(pArray, num);
    
        sortTeacer(pArray, num);
    
        printf("after sort\n");
    
        printTeacher(pArray, num);
    
        FreeTeacher(pArray);
    
        return ;
    }
    
    2.结构体做函数参数进阶

    上述代码中用来为结构体分配内存的create函数,我们发现他返回了一个结构体指针。而我们在真正工作中,经常会使用另一种方式。如下代码段所示,我们会利用二级指针做函数参数,并在函数内修改一级指针。这样做的好处就是create函数可以返回一个是否成功创建内存空间的标识。当工程代码比较庞大时,这将显得极为重要。

    int         num = 3;
    Teacher *pArray = NULL;
    ret = createTeacher02(&pArray, num);
    
    int createTeacher(Teacher **pT, int num)
    {
        int i = 0;
        Teacher * tmp = NULL;
        tmp = (Teacher *)malloc(sizeof(Teacher) * num);
        if (tmp == NULL)
        {
            return -1;
        }
        memset(tmp, 0, sizeof(Teacher) * num);
    
        for (i=0; i<num; i++)
        {
            tmp[i].alisname = (char *)malloc(60);
        }
        
        *pT = tmp;  //二级指针 形参 去间接的修改 实参 的值 
        return 0; 
    }
    

    相关文章

      网友评论

          本文标题:深度学习在设备中做interfere时的利器 | 没错就是结构体

          本文链接:https://www.haomeiwen.com/subject/hjjmhctx.html