这似乎是一个愚蠢的问题,但我找不到答案.

无论如何,如果将字符串中的任意字符设置为空, 然后释放字符串,这是否会导致内存泄漏?

我想我对免费功能的工作原理的了解是有限的.

/*
     char *
     strchr(const char *s, int c);

     char *
     strrchr(const char *s, int c);

     The strchr() function locates the first occurrence of c (converted to a
     char) in the string pointed to by s.  The terminating null character is
     considered part of the string; therefore if c is ‘\0’, the functions
     locate the terminating ‘\0’.

     The strrchr() function is identical to strchr() except it locates the
     last occurrence of c.
*/

char* string = strdup ("THIS IS, A STRING WITH, COMMAS!");

char* ch = strrchr( string, ',' );
*ch = 0;

free( string );

/*
    The resulting string should be: "THIS IS, A STRING WITH"
    When the string pointer is freed, does this result in a memory leak?
*/

推荐答案

在我看来,这不是一个愚蠢的问题. TLDR:不,您不会导致内存泄漏.

现在,更长的答案是:free根本不知道字符串是什么.如果您向它传递一个char*或int*,它就不会在意.

Malloc和Free的工作方式如下:当您调用Malloc时,您将提供一个大小并接收一个指针,并promise 从指针的位置开始在堆上保留相同数量的字节.但是,在这一点上,大小和位置也以某种方式在内部保存(这取决于实现细节). 现在当你调用Free时,它不需要知道大小,它只需要移除你的指针所属的条目和大小

附录:也不是每个char*都指向一个字符串,只是碰巧"abcd"变成了一个指向'a'的以空结尾的char*,但是char*本身指向一个字符,而不是多个

C++相关问答推荐

FFmpeg不检测比特流过滤器参数

char为16位且Short也为16位的c环境合法吗

理解C中的指针定义

设计处理各种数据类型的方法和数据 struct

intellisense不工作,甚至已经下载了c/c++扩展

C中出现分段错误后关闭文件

*p[num]和(*p)num的区别

VS代码';S C/C++扩展称C23真关键字和假关键字未定义

如何使用C for Linux和Windows的标准输入与gdb/mi进行通信?

在Rust和C之间使用ffi时如何通过 struct 中的[U8;1]成员传递指针

为什么我会收到释放后堆使用错误?

为什么数组的最后一个元素丢失了?

在txt文件中找到指定的字符串,并从数字中减go 相同的值

强制转换变量以在 struct 中蚕食

无法识别C编程语言的语法,如书中所示

C中的char**v*char[]

Ubuntu编译:C中的文件格式无法识别错误

使用 _Atomic float 时,MSVC 编译的代码会命中调试断言

memcmp 是否保证按顺序比较字节?

从管道读取数据时丢失