使char*指向另一个字符串文字泄漏内存吗?

use*_*873 5 c string memory-leaks c-strings string-literals

我对这个简单的例子有一些误解:

char *s = "abc";
s = "def";
Run Code Online (Sandbox Code Playgroud)

第二个字符串的赋值会导致内存泄漏,还是会被正确替换?如果前者是真的,我该如何替换s正确方法的价值?

Jea*_*bre 6

这两个字符串都是静态定义的,因此不存在内存泄漏。泄漏的内容是:

char *s = strdup("abc");  // dynamic memory allocation
s = "def";
Run Code Online (Sandbox Code Playgroud)

实际上,由于您无法再使用,因此存在少量静态内存浪费(不会称为泄漏)"abc"。

但由于即使通过调用代码所在的例程也无法重复它,所以我绝对不会称其为泄漏。

现在,如果你有char s[] = "abc";(数组,而不是指针)和一个"def"相同大小的字符串,你可以这样做:

strcpy(s,"def");
Run Code Online (Sandbox Code Playgroud)

替换字符串的内容(但不要在静态分配的指针上执行此操作,如定义代码:未定义的行为)。


usr*_*usr 6

不,没有内存泄漏.

您只需更改s为指向不同的字符串文字就可以了(使用此:) s = "def";.

简而言之,如果您没有使用malloc/ calloc/ realloc或任何返回动态分配内存的函数分配任何内容(文档告诉您free().例如,POSIX的getline()功能就是这样),您不需要free().