C语言中的malloc内存管理操作详解

版权申诉
2星 1 下载量 126 浏览量 更新于2024-10-18 收藏 13KB RAR 举报
在C语言编程中,内存管理是核心概念之一,它涉及到内存的申请、使用和释放。malloc是C语言标准库函数之一,用于动态内存分配,即在程序运行时从堆上分配一块指定大小的内存区域。在JSON处理库cJSON中,动态内存管理是一个重要组成部分,因为JSON对象通常在运行时构建,大小和结构可能未知,因此需要动态分配内存以适应不同的数据结构。 在cJSON库中,malloc被用来为JSON对象分配必要的内存空间。例如,创建一个新的JSON对象时,需要使用malloc来为这个对象的数据结构分配内存。此外,cJSON库也可能提供辅助函数来清除分配的内存,以避免内存泄漏和潜在的安全问题。 描述中提到的“申请内存”指的是使用malloc函数来向系统请求一块指定大小的内存块。一旦调用malloc,它会在堆区域寻找一个足够大的连续内存块以满足请求,并返回一个指向这块内存的指针。如果请求成功,程序员可以通过返回的指针访问这块内存,并可以在之后使用free()函数释放这块内存。 “清除内存”则涉及到将不再使用的内存空间归还给系统,以供其他程序或程序中的其他部分使用。这通常是通过调用free()函数来实现的,该函数接受一个指向之前由malloc分配的内存块的指针作为参数,并释放这块内存。如果一个程序未能适当地释放内存,那么随着时间的推移,它可能会耗尽所有可用的内存资源,从而导致所谓的内存泄漏。 cJSON是一个轻量级的JSON库,用于C语言,广泛应用于嵌入式系统和需要快速解析JSON数据的场合。它提供了一套用于处理JSON数据的接口,包括解析JSON字符串、创建和操作JSON对象以及序列化JSON对象回字符串。在处理这些JSON对象时,cJSON内部会频繁地使用动态内存分配和释放。 由于cJSON本身是开源的,其源代码中必然包含了对malloc和free等内存管理函数的使用。例如,在创建一个新的JSON对象时,可能会看到如下代码片段: ```c typedef struct cJSON { char *valuestring; int type; struct cJSON *next; struct cJSON *prev; int child; char *string; } cJSON; ``` 创建一个这样的结构体实例时,就可能需要使用malloc来分配内存: ```c cJSON *object = (cJSON *)malloc(sizeof(cJSON)); ``` 这样,就为一个新的JSON对象分配了足够的内存。 在实际使用cJSON库处理JSON数据时,开发者需要确保适当地管理内存,特别是在解析大量或结构复杂的JSON数据时。如果处理不当,很容易造成内存泄漏。因此,开发者除了利用cJSON提供的API外,还需要注意何时使用malloc,以及何时使用free函数来释放内存。 在使用压缩包子文件时,通常不会直接与内存管理打交道,因为压缩包子文件通常是一种压缩打包的格式,用于存储和传输数据。在处理压缩包子文件时,内存管理的工作更多是隐式进行的,开发者需要关注的是如何从压缩文件中读取和解析数据,以及将数据写入压缩文件中。虽然在某些情况下,如数据解压时,仍可能涉及到内存分配。 总结来说,malloc是C语言中用于动态内存分配的重要函数,它使得程序员可以灵活地管理内存,而不会像静态内存分配那样受编译时大小的限制。在使用cJSON等库处理JSON数据时,了解和正确使用malloc和free等内存管理函数是保证程序稳定性和效率的关键。同时,开发者需要关注cJSON库内部如何使用这些函数来维护其数据结构,并确保在整个应用程序中进行良好的内存管理实践。

将下面代码优化一下, 只要一个函数 最终输出新的json字符串指针#include <stdio.h> #include <stdlib.h> #include <string.h> #include <openssl/hmac.h> #include "cJSON.h" char *sortJsonString(cJSON *json); char *getSign(char *jsonString, char *key); char *addSignToJson(char *jsonString, char *key, char *signKey); char *sortJsonString(cJSON *json) { int count = cJSON_GetArraySize(json); char **keys = (char **) malloc(count * sizeof(char *)); int i = 0; cJSON_ArrayForEach(json, json) { keys[i++] = strdup(json->string); } qsort(keys, count, sizeof(char *), strcmp); char *sortString = (char *) malloc(1); sortString[0] = '\0'; for (int i = 0; i < count; i++) { cJSON *item = cJSON_GetObjectItemCaseSensitive(json, keys[i]); if (item->type == cJSON_Object) { char *subSortString = sortJsonString(item); sortString = (char *) realloc(sortString, strlen(sortString) + strlen(keys[i]) + strlen(subSortString) + 3); sprintf(sortString + strlen(sortString), "%s=%s&", keys[i], subSortString); free(subSortString); } else { sortString = (char *) realloc(sortString, strlen(sortString) + strlen(keys[i]) + strlen(item->valuestring) + 3); sprintf(sortString + strlen(sortString), "%s=%s&", keys[i], item->valuestring); } } sortString[strlen(sortString) - 1] = '\0'; cJSON_ArrayForEach(json, json) { free(keys[--i]); } free(keys); return sortString; } char *getSign(char *jsonString, char *key) { char *sortString = sortJsonString(cJSON_Parse(jsonString)); unsigned char *hmac = HMAC(EVP_sha256(), key, strlen(key), (const unsigned char *) sortString, strlen(sortString), NULL, NULL); char *sign = (char *) malloc(65); for (int i = 0; i < 32; i++) { sprintf(&sign[i * 2], "%02x", hmac[i]); } sign[64] = '\0'; free(sortString); return sign; } char *addSignToJson(char *jsonString, char *key, char *signKey) { char *sign = getSign(jsonString, key); cJSON *json = cJSON_Parse(jsonString); cJSON_AddStringToObject(json, signKey, sign); char *result = cJSON_Print(json); free(sign); cJSON_Delete(json); return result; }

181 浏览量

下面函数中 最后一个参数是必须的吗 如果只要前面两个参数 怎么修改char *addSignToJson(char *jsonString, char *key, char *signKey) { cJSON *json = cJSON_Parse(jsonString); int count = cJSON_GetArraySize(json); char **keys = (char **) malloc(count * sizeof(char *)); int i = 0; cJSON_ArrayForEach(json, json) { keys[i++] = strdup(json->string); } qsort(keys, count, sizeof(char *), strcmp); char *sortString = (char *) malloc(1); sortString[0] = '\0'; for (int i = 0; i < count; i++) { cJSON *item = cJSON_GetObjectItemCaseSensitive(json, keys[i]); if (item->type == cJSON_Object) { char *subSortString = sortJsonString(item); sortString = (char *) realloc(sortString, strlen(sortString) + strlen(keys[i]) + strlen(subSortString) + 3); sprintf(sortString + strlen(sortString), "%s=%s&", keys[i], subSortString); free(subSortString); } else { sortString = (char *) realloc(sortString, strlen(sortString) + strlen(keys[i]) + strlen(item->valuestring) + 3); sprintf(sortString + strlen(sortString), "%s=%s&", keys[i], item->valuestring); } } sortString[strlen(sortString) - 1] = '\0'; unsigned char *hmac = HMAC(EVP_sha256(), key, strlen(key), (const unsigned char *) sortString, strlen(sortString), NULL, NULL); char *sign = (char *) malloc(65); for (int i = 0; i < 32; i++) { sprintf(&sign[i * 2], "%02x", hmac[i]); } sign[64] = '\0'; cJSON_AddStringToObject(json, signKey, sign); char *result = cJSON_Print(json); for (int i = 0; i < count; i++) { free(keys[i]); } free(keys); free(sortString); cJSON_Delete(json); free(sign); return result; }

106 浏览量