结构体指针的内存空间分配问题(C语言)

结构体指针的内存空间分配问题(C语言)

提示:文章结尾有两个代码的合并的精简版!

 结构体指针在使用前,必须分配内存空间给该结构体指针,否则会导致数据无法录入;在给结构体指针分配内存空间时又分两种情况,一种是在自定义函数内对结构体指针进行内存分配;另一种是在主函数内对结构体指针分配内存空间。
 下面让我们通过具体的代码和分析深入剖析其中的区别。


结构体指针内存在自定义函数中分配

  • 所给代码的含义是:创建一个结构体 指针,通过自定义函数对该结构体指针进行初始化(包括内存分配和数据的初始化),主要解决的是结构体指针在作为函数参数传入时,如何传入才能使结构体指针在自定义函数内部初始化后并且能传出,所用的就是指针作为参数传参时能够修改数据本体的值的原理
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
typedef struct
{
	int val[100];
	int top;
}Num;
void Init(Num** temp)	//也可定义一个指向结构体的指针*Linklist 
{								//这里为了便于理解,使用二重指针
	*temp=(Num*)malloc(sizeof(Num));	//由于函数内是对结构体指针本身做操作,而不是结构体内的变量操作
	(*temp)->top=0;	//因此调用函数进行操作时,同样需要使用指针,且为二重指针,即指针的指针
	(*temp)->val[0]=-1;					//才能在函数内对结构体分配空间,并传出函数
}
void main()
{
	Num* ptr;
	Init(&ptr); //
	printf("val=%d top=%d \n",ptr->val[0],ptr->top);
}

由上述代码及分析,我们易知:
 在函数内部给结构体分配空间时,不能直接给结构体指针分配空间,而应该给结构体指针的指针分配空间,因为在函数内部改变信息不通过地址传递,无法传出改变后的信息;因为结构体指针本身就是指针,还需要再添加一重指针才能传出对结构体改变的信息。

结构体指针内存在主函数中的分配以及在自定义函数中修改结构体的内容辨析

  • 该代码含义与上一代码大致相同,但做了略微修改,有部分区别,主要区别就是把对结构体指针的内存空间分配的操作拿到了主函数中,并且与上一个代码相比多了一个在自定义函数中对结构体指针内容的修改,用以再次说明在指针传参的函数中,在自定义函数内部对指针所指数据的修改是能够带出自定义函数的。也就是对指针的操作就是对本体地址的操作。
#include"stdio.h"
#include"stdlib.h"
#include"string.h"

typedef struct
{
	int val[100];
	int top;
}Num;

void Init(Num* ptr)
{								
	printf("test-2:val=%d top=%d \n",ptr->val[0],ptr->top);
	ptr->top=100;	//ptr内容被修改
}

void main()
{
	Num* ptr;

	ptr=(Num*)malloc(sizeof(Num));
	ptr->top=0;
	ptr->val[0]=12;
	
	printf("test-1:val=%d top=%d \n",ptr->val[0],ptr->top);
	Init(ptr); //在主函数中对结构体指针进行操作,可以自定义函数输出信息
				//在这里,同样因为ptr本身就是指针,所以可以直接把它所携带的信息传入函数
	printf("test-3:val=%d top=%d \n",ptr->val[0],ptr->top); 
	//输出结果证明可以把结构体内的信息修改并传出
	//因为ptr是指针,可以传出修改后的信息
}

分析请看代码内的注释

二者辨析(总结)敲黑板!!!

 结合以上两个例子,总结一句话,对结构体指针分配空间,是给指针分配空间,而不是变量,在内部函数分配空间时,由于结构体指针本身就是指针,所以在传入结构体指针时,还需要添加一重指针,即二重指针;而在内部函数对结构体变量进行修改时,因为传入的结构体指针本身就是指针,所以修改后的变量可以传出来。
结构体指针是指针,对结构体指针操作需要再添加一重指针(作为参数传入时),此时使用的是二重结构体指针;结构体指针是指针,使用的是结构体指针,所以对结构体变量进行修改时,可以自动传出(作为参数传入)。

最后一段可能有点绕,可以稍微加以思考思考就明白了~
有不明白的地方,欢迎在评论区留言讨论~

  • 23
    点赞
  • 96
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值