创建一个只有 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);
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);