zoukankan      html  css  js  c++  java
  • 深入理解C语言-结构体做函数参数

    结构体做函数参数,在C语言中属于常见现象,此时为了内存考虑,不传递结构体,而是传递结构体的地址

    结构体定义

    struct Man
    {
    	char name[64];
    	int age;
    };
    

    结构体可以与typedef结合使用

    typedef struct _Man
    {
    	char name[64];
    	int age;
    }Man;
    

    另外,可以直接定义结构体变量

    typedef struct _Man
    {
    	char name[64];
    	int age;
    }Man1,Man2;
    

    还可以采用匿名结构体变量

    typedef struct
    {
    	char name[64];
    	int age;
    }Man1;
    

    结构体指针

    指向结构体的指针

    Man tArray;
    Man *pArray = NULL;
    pArray = &tArray;
    
    Man tArray[3];
    Man *pArray = NULL;
    pArray = tArray;
    

    简单的结构体做函数参数

    int printMan(Man *tArray, int num)
    {
    	int i = 0;
    	for (i = 0; i < num; i++)
    	{
    		printf("%d 
    ", tArray[i].age);
    	}
    	return 0;
    }
    

    被调函数给结构体分配内存

    当结构体的内存在被调函数中分配时,要将其传出,有两种方法

    1. 使用return传出
    Man *createMan(int num)
    {
        Man *tArray = NULL;
    	tArray = (Man *)malloc(num * sizeof(Man));
    	if (tArray == NULL)
    	{
    		return NULL;
    	}
    	return tArray;
    }
    
    1. 使用二级指针传出
    int createMan(Man **tArray, int num)
    {
    	(*tArray) = (Man *)malloc(num * sizeof(Man));
    	if (tArray == NULL)
    	{
    		return -1;
    	}
    	return 0;
    }
    createMan(&Man1, 3);
    

    当结构体中存在指针

    存在一级指针

    typedef struct _Man
    {
    	char name[64];
        char *like;
    	int age;
    }Man;
    

    此时,要注意一点,要使用结构中的指针,就需要给其分配内存空间

    Man *creatMan(int num)
    {
    	int i = 0;
    	Man *tArray = NULL;
    	tArray = (Man *)malloc(num * sizeof(Man));
    	if (tArray == NULL)
    	{
    		return NULL;
    	}
    	for (i = 0; i < num; i++)
    	{
    		tArray[i].like = (char *)malloc(100);
    	}
    	return tArray;
    }
    
    Man *pArray = NULL;
    pArray = crateMan(3);
    

    存在二级指针

    typedef struct _Man
    {
    	char name[64];
        char *like;
        char **skill;
    	int age;
    }Man;
    

    此处和一级指针类似,必须分配其内存

    Man *createMan(int num)
    {
    	int i = 0, j = 0;
    	Man *tArray = NULL;
    	tArray = (Man *)malloc(num * sizeof(Man));
    	if (tArray == NULL)
    	{
    		return NULL;
    	}
    	for (i = 0; i < num; i++)
    	{
    		tArray[i].like = (char *)malloc(100);
    	}
    
    	for (i = 0; i < num; i++)
    	{
    		char **ptmp = (char **)malloc((4+1)*sizeof(char *));
    		for (j = 0; j < 4; j++)
    		{
    			ptmp[j] = (char *)malloc(120);
    		}
    		ptmp[4] = NULL;//分配5个空间,最后一个空间用来自我约束,相当于分配4个空间
    		tArray[i].skill = ptmp;
    	}
    
    	return tArray;
    }
    
    Man *pArray = NULL;
    pArray = createMan(3);
    if (pArray == NULL)
    {
    	return ;
    }
    

    在使用完毕要释放内存,此时开辟了多少内存就要释放多少内存,从内层到外层依次释放

    int FreeTArray(Man *tArray, int num)
    {
    	int i = 0, j = 0; 
    	if (tArray == NULL)
    	{
    		return -1;
    	}
    	for (i = 0; i < num; i++)
    	{
    		char **tmp = tArray[i].skill;
    		if (tmp ==NULL)
    		{
    			continue;;
    		}
    		for (j = 0; j < 3; j++)
    		{
    			if (tmp[j] != NULL)
    			{
    				free(tmp[j]);
    			}
    		}
    		free(tmp);
    	}
    	for (i = 0; i < 3; i++)
    	{
    		if (tArray[i].like != NULL)
    		{
    			free(tArray[i].like);
    			tArray[i].like = NULL;
    		}
    	}
    	free(tArray);
    	tArray = NULL;
    }
    

    求结构体成员的相对偏移量

    int i = 0;
    i = (int )&(((Man *)0)->age);
    printf("i:%d 
    ", i);
    

    其实是将首地址映射到0,求其偏移量

  • 相关阅读:
    eclipse中的项目如何打成war包
    【SVN】Please execute the 'Cleanup' command.
    2021.06.02模拟赛DP2
    2021.05.26模拟赛 DP1
    状压DP
    高斯消元
    矩阵快速幂
    2021.05.10讲题
    Luogu P2152[SDOI 2009]Super GCD
    Tarjan
  • 原文地址:https://www.cnblogs.com/cj5785/p/10664758.html
Copyright © 2011-2022 走看看