char *str;
int length = 100;
str = (char *)malloc(sizeof(char) * (length+1));
*str = '\0';
free(str);
strcpy strlen不起作用, 我试过表达strlen(str);结果是0 会免费工作吗? 如果现在免费工作,可能会有很多内存泄漏。
答案 0 :(得分:2)
Strlen返回零,因为在分配内存后,指针的起始值为'\0'
。因此检查strlen直到出现空字符。所以返回值为零。
答案 1 :(得分:1)
strlen
将为您提供C字符串的长度,而不是缓冲区的大小。
C字符串的长度为determined by the terminating null-character:C字符串与字符串开头和终止空字符之间的字符数一样长(不包括终止空字符本身)。所以0是正确的答案。
然而,malloc()
例程将保留您所做分配的大小,因此当您free()时,它会释放适当的空间。
您可以根据需要跟踪内存的大小(请参阅Using sizeof with a dynamically allocated array和Is it possible to find the Memory Allocated to the Pointer, without searching for the malloc statement)。
使用gcc / glibc ,您拥有malloc_usable_size功能(不包含在POSIX.x / C90 / C99 / C11中):
#include <malloc.h>
size_t malloc_usable_size (void *ptr);
返回ptr
指向的块中的可用字节数。
答案 2 :(得分:1)
字符串的长度(由strlen()
计算)与内存分配的大小无关。 free()
无法根据strlen()
确定返回堆的字节数。在后台处理将释放一块内存大小的簿记。
答案 3 :(得分:0)
free()需要 void * ,类似void *
从 malloc()系列函数返回。因此它将释放分配的内存量,而不管放置 \ 0 分隔符的位置。
strlen()不起作用,因为它计算的字符数最多为 \ 0 分隔符。因为这是你的第零个索引所以在这个分隔符之前没有字符,因为结果返回0。