结构体应该何时分配内存,和传参问题

老忘的东西,说明自己还是掌握的不熟练,记录一下。

typedef struct student

{                     //数据域     

        int num;        //学号
        int score;    //分数
       char name[20];
}STU;

1.何时分配内存

        根本就是你想给他的成员赋值,

例1:

          (1)我给他的学号赋值,首先定义一个变量,STU stu;//同时已经分配好内存了。

          (2) 给学号赋值 ,scanf("%d ",&stu.num);

例2:

          (1)同样想给他的学号赋值,STU *new = NULL;//只开辟了存放new地址的内存,地址大小就是sizeof(new)。而不是整个结构体的。/*就相当于你去朋友家,你的朋友给了你一张写着门牌号的纸,这张纸就是指针的内存空间*/

          (2)下面想要给学号赋值必须先给结构体分配内存,new=(STU*)malloc(sizeof(STU));/*相当于你朋友家房子的大小,房子里有你朋友,家具等等,上面说的纸上放着门牌号,但是不可能将你朋友和家具放在纸上,房子相当于结构体的内存空间*/

          (3)给学号赋值,scanf("%d ",&new->num);

2.结构体当做参数

      下面先给大家看两个例子

例1:

#include <stdio.h>
#include <stdlib.h>
typedef struct student{
	int num;
	char name[20];
}STU;
void InitStu(STU **new)
{
	(*new) = (STU *)malloc(sizeof(STU));/*此时(*new)就相当于main函数的stu,因为操作的地址一样*/
        (*new)->num = 66;
         //printf("--%p\n", *new);    
}
int main()
{
	STU *stu = NULL;
	InitStu(&stu);
       // printf("--%p\n", stu);    
        printf("%d\n", stu->num);
        free(stu);
         return 0;
}

运行结果无误。

再看个例2:

#include <stdio.h>
#include <stdlib.h>
typedef struct student{
	int num;
	char name[20];
}STU;

void InitStu(STU *new)
{
        printf("--%p", new);/*还是main函数中stu的地址*/
        new = (STU*)malloc(sizeof(STU));/*new 重新指向了堆中的地址*/
	new->num = 66;/*给堆中的结构体成语赋值*/
}

int main()
{
	STU stu;/*已经开辟了内存*/
	InitStu(&stu);/*传进去的是stu的地址,但是没有意义*/
	printf("%d\n", stu.num);
        return 0;
}

运行结果不能确定。 why? 例2中很明显,定义了stu 变量,把stu的地址传进了InitStu函数。但是执行malloc的时候new的地址不是main函数中的stu的地址了,是在堆中开辟的地址。

总结:现在看来也没什么难点嘛,对付指针这种特殊的变量,就明白他两个功能好了

1.函数间的地址传递

2.用传址的方式改变实参内容,或者访问其数据成员。


猜你喜欢

转载自blog.csdn.net/lyw13522476337/article/details/80880109