枚举--enum和动态内存管理(malloc和free)

枚举---enum:它的本意就是列举事物,比如,颜色和性别,则代码为:

#include<stdio.h>
//枚举的示例:性别,颜色
enum sex//性别
{
	MALE,
	FEMALE,
	SECRTY
};
enum  clore//颜色
{
	ROW,
	BLUS,
	GREEN
};
  • 枚举在C语言中运用的比较多,这里就不过多的展开了,那么就来讲一讲,动态内存管理,这个就非常的重要的,它有四种函数:malloc,free,calloc,realloc。我们一一来介绍它们。
  • 我们为什么要有动态内存分配呢?对于一般的C语言,我们需要向它申请一定的空间,才能存一个内存,这样就非常的麻烦,所以就有动态内存的分配,
  • malloc函数:它的返回类型为void*,它的头文件:<stdlib.h>,它的表达式为:void* malloc(size_t size);。这个函数就可以向内存申请一块连续可用的空间。这个代码为:
    #include<stdlib.h>
    
    int main()
    {
    	//20个字节,存放5个整数
    	int* p = malloc(5 * sizeof(int));
    	if (p == NULL)
    	{
    		perror("malloc");
    		return 1;
    	}
    	//使用空间
    	int i = 0;
    	for (i = 0; i < 5; i++)
    	{
    		*(p + i) = i = 1;
    		printf("%d\n", p[i]);
    	}
    	return 0;
    }

    这个就是malloc的使用。必须要有判断是否为NULL。

  • 但是这个malloc还有一定的缺陷,要到最后,把空间的使用权限还给操作空间,那就需要free这个函数来实现,

  • free函数:它的表达式为:void free(void* ptr);,free是用来释放动态开辟的内存。比如,就拿malloc这个例子来说,它所对应的代码为:

    //free的使用
    int main()
    {
    	//20个字节,存放5个整数
    	int* p = malloc(5 * sizeof(int));
    	if (p == NULL)
    	{
    		perror("malloc");
    		return 1;
    	}
    	//使用空间
    	int i = 0;
    	for (i = 0; i < 5; i++)
    	{
    		*(p + i) = i = 1;
    	}
    	free(p);//此时p为野指针,传递free函数的是要释放的内存空间的起始地址。
    	p = NULL;//现在为空指针。
    	return 0;
    }

    但是,这里一定不要改写成这个:如果是这个的话,则代码会崩掉。我们再写个代码巩固一下:

则代码为:

int main()
{
	int num = 0;
	scanf("%d", &num);
	int arr[num] = { 0 };
	int* ptr = NULL;
	ptr = (int*)malloc(num * sizeof(int));
	if (NULL != ptr)//判断ptr指针是否为空 
	{
		int i = 0;
		for (i = 0; i < num; i++)
		{
			*(ptr + i) = 0;
		}
	}
	free(ptr);//释放ptr所指向的动态内存 
	ptr = NULL;//是否有必要? 
	return 0;
}

这个就充分展现了free的作用。

  • 还有两个calloc和realloc我们下一章再讲,请尽请期待吧。
  • 16
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用WINUSB读取GUID,您需要执行以下步骤: 1. 打开设备 使用WinUsb_Initialize函数打开设备并获得设备句柄。您需要提供设备的PID和VID。 2. 获取GUID描述符 使用WinUsb_QueryDeviceInformation函数获取设备的GUID描述符。您需要指定GUID描述符的索引号。 3. 读取GUID 使用WinUsb_ReadPipe函数从设备中读取GUID。您需要指定读取的管道和缓冲区的大小。 以下是一个简单的代码示例,可帮助您开始使用WINUSB读取GUID: ```C++ #include <windows.h> #include <winusb.h> #include <setupapi.h> #include <devguid.h> #define GUID_INDEX 1 #define BUFFER_SIZE 16 int main() { // 打开设备 GUID guid; HDEVINFO hdevinfo = NULL; SP_DEVICE_INTERFACE_DATA interface_data; SP_DEVINFO_DATA devinfo_data; WINUSB_INTERFACE_HANDLE winusb_handle; BOOL result; // 获取设备信息 hdevinfo = SetupDiGetClassDevs(&GUID_DEVCLASS_USB, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); if (hdevinfo == INVALID_HANDLE_VALUE) { printf("Failed to get device info\n"); return 1; } // 枚举设备 interface_data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); result = SetupDiEnumDeviceInterfaces(hdevinfo, NULL, &GUID_DEVCLASS_USB, 0, &interface_data); if (!result) { printf("Failed to enum device interfaces\n"); return 1; } // 获取设备路径 DWORD required_size; result = SetupDiGetDeviceInterfaceDetail(hdevinfo, &interface_data, NULL, 0, &required_size, NULL); if (!result && GetLastError() != ERROR_INSUFFICIENT_BUFFER) { printf("Failed to get device interface detail\n"); return 1; } PSP_DEVICE_INTERFACE_DETAIL_DATA interface_detail_data; interface_detail_data = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(required_size); interface_detail_data->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); result = SetupDiGetDeviceInterfaceDetail(hdevinfo, &interface_data, interface_detail_data, required_size, NULL, NULL); if (!result) { printf("Failed to get device interface detail\n"); return 1; } // 打开 WinUSB 设备 HANDLE device_handle = CreateFile(interface_detail_data->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); if (device_handle == INVALID_HANDLE_VALUE) { printf("Failed to open device\n"); return 1; } // 初始化 WinUSB result = WinUsb_Initialize(device_handle, &winusb_handle); if (!result) { printf("Failed to initialize WinUSB\n"); CloseHandle(device_handle); return 1; } // 获取 GUID 描述符 UCHAR guid_descriptor[BUFFER_SIZE]; ULONG guid_descriptor_length = BUFFER_SIZE; result = WinUsb_QueryDeviceInformation(winusb_handle, DeviceUxdGuid, &guid_descriptor_length, guid_descriptor); if (!result) { printf("Failed to query GUID descriptor\n"); WinUsb_Free(winusb_handle); CloseHandle(device_handle); return 1; } // 读取 GUID UCHAR guid_data[BUFFER_SIZE]; ULONG guid_length = BUFFER_SIZE; result = WinUsb_ReadPipe(winusb_handle, 0x81, guid_data, guid_length, NULL, NULL); if (!result) { printf("Failed to read GUID\n"); WinUsb_Free(winusb_handle); CloseHandle(device_handle); return 1; } // 关闭设备 WinUsb_Free(winusb_handle); CloseHandle(device_handle); return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值