c语言结构体中的内存管理

最近在接触c语言项目,使用VLD查看内存泄漏,就一直在纠结结构体中如果定义了指针变量,在外面使用malloc为其分配了空间,那仅仅释放结构体指针可以吗?会存在内存泄漏吗?因此做了个小实验,前面话比较绕,描述可能有问题,那么直接上代码:
首先定义结构体:

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

struct Test
{
	unsigned char* ucTest;
	int a;
};

结构体中包含了一个uchar指针(后面为其分配内存空间,问题的核心也在这里:需不需要单独释放后面为其分配的内存呢?)和int变量。
首先不单独释放,测试代码如下:

void test()
{
	Test* test = NULL;
	test = (Test*)malloc(sizeof(Test) * 4);

	for (int i = 0; i < 4; i++)
	{
		test[i].ucTest = (unsigned char*)malloc(10);
		test[i].a = i;
	}

	//for (int i = 0; i < 4; i++) //单独释放结构体中数组的内存。
	//{
	//	free(test[i].ucTest);
	//	test[i].ucTest = NULL;
	//}

	free(test);//释放结构体数组
	test = NULL;
	
}

运行程序,发现VLD提示内存泄漏,结果如下所示:

Visual Leak Detector detected 4 memory leaks (184 bytes).
Largest number used: 252 bytes.
Total allocations: 252 bytes.
Visual Leak Detector is now exiting.
The program '[4820] test.exe' has exited with code 0 (0x0).

查找内存泄漏的地方,定位到

test[i].ucTest = (unsigned char*)malloc(10);

从而猜想可能需要单独释放内存,因而取消掉单独释放内存的注释,继续运行程序:

No memory leaks detected.
Visual Leak Detector is now exiting.

提示无内存泄漏。说明还是需要单独释放内存的

PS: C语言这个语言真的细节很多,之前写代码都是实现功能就行,对于细节把握不足,后面这个方面还是需要改进。自己算是C语言小白,如果有问题希望大家能够指出。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言结构体是一种用户自定义的数据类型,它允许我们存储不同类型的数据在一个内存结构体是由多个成员组成的,每个成员可以是任意数据类型,可以是基本数据类型(如整数、浮点数、字符等),也可以是其他结构体类型或指针类型。结构体可以用来描述现实的复杂对象或数据结构,例如学生、员工、图书等,方便我们对其进行操作和管理。 使用结构体可以将相关的数据和功能封装在一起,提高代码的可读性和可维护性。通过定义一个结构体类型,我们可以创建该类型的变量,并通过变量名来访问结构体的成员。结构体成员的访问可以使用"."运算符来进行,例如:"struct_name.member_name"。 在C语言,可以通过以下方式定义一个结构体: ``` struct 结构体名称 { 数据类型 成员1; 数据类型 成员2; ... }; ``` 可以使用typedef关键字来给结构体类型定义一个别名,方便后续使用。 结构体的使用可以参考下面的例子: ``` #include<stdio.h> // 定义一个结构体类型 struct Student { int id; char name[20]; int age; }; int main() { // 声明一个结构体变量 struct Student stu; // 给结构体的成员赋值 stu.id = 123; strcpy(stu.name, "Tom"); stu.age = 18; // 打印结构体的成员 printf("Student ID: %d\n", stu.id); printf("Student Name: %s\n", stu.name); printf("Student Age: %d\n", stu.age); return 0; } ``` 以上代码定义了一个名为"Student"的结构体类型,包含id、name和age三个成员。在main函数,声明了一个名为"stu"的结构体变量,并给成员赋值。然后通过printf函数打印出结构体成员的值。 总的来说,C语言结构体是一种灵活、强大的数据类型,可以用来组织和操作复杂的数据结构,提高程序的可读性和可维护性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值