创建仅包含 NULL 值的 char 数组

use*_*925 1 c arrays valgrind

output_s = (char**)malloc(sizeof(char*));
output_s[0] = (char*)malloc(sizeof(char));
output_s[0] = NULL;
Run Code Online (Sandbox Code Playgroud)

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

  free(result[0]);
  free(result);
Run Code Online (Sandbox Code Playgroud)

稍后调用它来释放内存,结果是上面返回的 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
Run Code Online (Sandbox Code Playgroud)

camelCaser.c:33 是 malloc 的行

output_s[0] = (char*)malloc(sizeof(char));
Run Code Online (Sandbox Code Playgroud)

Nik*_* C. 5

output_s[0] = (char*)malloc(sizeof(char));
Run Code Online (Sandbox Code Playgroud)

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

output_s[0] = NULL;
Run Code Online (Sandbox Code Playgroud)

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

如果您想要的新字符串为空(也称为“空字符串”),则:

output_s[0] = malloc(sizeof(char));
output_s[0][0] = '\0';
Run Code Online (Sandbox Code Playgroud)

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

output_s[0] = malloc(sizeof(char) * N);
output_s[0][0] = '\0';
Run Code Online (Sandbox Code Playgroud)

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

output_s[0] = malloc(N);
output_s[0][0] = '\0';
Run Code Online (Sandbox Code Playgroud)

请注意,这只适用于分配char数组时。要分配其他类型的数组,您仍然需要sizeof(type) * N.

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

output_s[index] = NULL;
Run Code Online (Sandbox Code Playgroud)

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

free(output_s[index]);
output_s[index] = NULL;
Run Code Online (Sandbox Code Playgroud)

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

output_s[0] = malloc(N);
Run Code Online (Sandbox Code Playgroud)

代替:

output_s[0] = (char*)malloc(N);
Run Code Online (Sandbox Code Playgroud)