1

现在我正在努力计算cJSON对象的大小。到目前为止,我已经这样做了:

cJSON *payload = cJSON_CreateObject();
...
size_t size_payload = sizeof(payload);

显然,我初始化了有效负载对象并打印到终端以验证数据的完整性,一切正常。但是,在打印sizeof结果后,字节数始终为 4,但对于长字符串(如我的),它应该在 500 字节左右。

我在这里缺少处理cJSON对象的东西吗?

希望您能提供帮助,或者给我一个示例,说明如何获得整个尺寸的正确值。

4

1 回答 1

4

sizeof()是编译时常量。它在运行时没有数据的概念。

sizeof(payload)payload变量的字节大小,它被声明为cJSON*指针。所以它的字节大小总是相同的 - sizeof(void*),在你的情况下是 4 个字节(因为你正在为 32 位编译你的应用程序)。它的大小不是cJSON它所指向的对象的大小。

即便如此,如果您尝试取消引用指针并sizeof()cJSON对象本身上使用,即sizeof(*payload),它将是编译时cJSON结构本身的字节大小,而不是对象在内部为其自身分配的任何数据的字节大小在运行时cJSON

AFAICScJSON不提供返回它所持有的 JSON 数据的字节大小的方法,因此您只需将 JSON 格式化为字符串变量,然后在运行时查询该字符串的大小,例如:

char *str = cJSON_Print(payload); // or cJSON_PrintUnformatted() or cJSON_PrintBuffered() ...
if (str) {
    size_t len = strlen(str);
    cJSON_free(str);
    ...
}
于 2021-02-18T02:37:58.857 回答