2

当我阅读 cJSON 的代码时,对代码的理解有问题:

static void *(*cJSON_malloc)(size_t sz) = malloc;

static void (*cJSON_free)(void *ptr) = free;
4

3 回答 3

2

这些是函数指针初始化。例如:

static void *(*cJSON_malloc)(size_t sz) = malloc;

相当于:

typedef void *(*cJSON_malloc_type)(size_t sz);
static cJSON_malloc_type cJSON_malloc = malloc;

我希望这更容易理解。

于 2013-09-03T13:45:32.683 回答
2

这只是函数指针。通过这种方式,我们可以使用“cJSON_malloc”代替 malloc 和 cJSON_free 代替 free。

于 2013-09-03T11:50:28.227 回答
1

正如其他人已经提到的,这些是函数指针。有了这些,您可以在运行时更改分配器和释放器功能。

您想要使用与 malloc 和 free 不同的分配器的原因有很多,例如:

  • 表现
  • 调试
  • 安全
  • 特殊设备内存

将每个分配和释放打印到标准输出的示例分配器:

void *my_malloc(size_t size) {
    void *pointer = malloc(size);
    printf("Allocated %zu bytes at %p\n", size, pointer);
    return pointer;
}

void my_free(void *pointer) {
    free(pointer);
    printf("Freed %p\n", pointer);
}

void change_allocators() {
    cJSON_hooks custom_allocators = {my_malloc, my_free};
    cJSON_InitHooks(custom_allocators);
}
于 2017-11-07T10:09:16.470 回答