创建一个只有 NULL 值的 char 数组

Creating a char array with only a NULL value

output_s = (char**)malloc(sizeof(char*));
output_s[0] = (char*)malloc(sizeof(char));
output_s[0] = NULL;

所以我要创建的是一个 char 数组,它通常是 char* 字符串的 char 数组,但是对于这个特定的输入案例,我想创建一个只包含 NULL 条目的数组,并且对于出于某种原因,当我创建条目时,我可以释放我的数组,但无法释放设置为 null 且泄漏 1 个字节的条目。

  free(result[0]);
  free(result);

稍后调用它来释放内存,结果是上面返回的 output_s 变量

==18402== HEAP SUMMARY:
==18402==     in use at exit: 1 bytes in 1 blocks
==18402==   total heap usage: 3 allocs, 2 frees, 1,033 bytes allocated
==18402== 
==18402== 1 bytes in 1 blocks are definitely lost in loss record 1 of 1
==18402==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-    amd64-linux.so)
==18402==    by 0x4007D1: camel_caser (camelCaser.c:33)
==18402==    by 0x400CE4: test_camelCaser (camelCaser_tests.c:30)
==18402==    by 0x400D47: main (camelCaser_main.c:13)
==18402== 
==18402== LEAK SUMMARY:
==18402==    definitely lost: 1 bytes in 1 blocks
==18402==    indirectly lost: 0 bytes in 0 blocks
==18402==      possibly lost: 0 bytes in 0 blocks
==18402==    still reachable: 0 bytes in 0 blocks
==18402==         suppressed: 0 bytes in 0 blocks

camelCaser.c:33 是 mallocs

的行
output_s[0] = (char*)malloc(sizeof(char));

您不能释放 NULL,即使它存储在以前包含非 NULL 指针的变量中。
当您将 NULL 写入同一个变量时,非 NULL 指针已经丢失了。
非 NULL 指针指向的 malloced 内存丢失、泄漏。

对于 free(x),您要求释放位于地址 x 的内存块。

如果您将 x 设置为 0,那么您要求释放位于地址 0 的内存块。

output_s[0] = (char*)malloc(sizeof(char));

这会分配内存并在 output_s[0] 中存储指向它的指针。

output_s[0] = NULL;

这会用 NULL 覆盖先前的指针,从而泄漏先前指针指向的内存,使 valgrind 报告它。

如果您希望新字符串为空(又名 "null string"),则:

output_s[0] = malloc(sizeof(char));
output_s[0][0] = '[=12=]';

但是新字符串只有一个字符 space,这表明这不是您想要的。如果要为 N 个字符的字符串分配内存,则分配它:

output_s[0] = malloc(sizeof(char) * N);
output_s[0][0] = '[=13=]';

由于 sizeof(char) 始终为 1,您可以改为这样做:

output_s[0] = malloc(N);
output_s[0][0] = '[=14=]';

请注意,这仅在分配 char 数组时适用。分配其他类型的数组,还是需要sizeof(type) * N.

如果您希望整个 char** 数组以 NULL 结尾,则只需将最后一个元素设置为 NULL。您不需要额外分配任何东西,因为所有 char* 元素的内存都已经分配好了:

output_s[index] = NULL;

但是,如果该特定元素包含分配的字符串,您需要先释放它:

free(output_s[index]);
output_s[index] = NULL;

作为旁注,我建议改掉将 malloc() 的 return 值强制转换的坏习惯。它不是必需的,它可以在某些情况下隐藏错误。含义,使用:

output_s[0] = malloc(N);

而不是:

output_s[0] = (char*)malloc(N);