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

Does making a char* point to another string literal leak memory?

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

char *s = "abc";
s = "def";

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

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

char *s = strdup("abc");  // dynamic memory allocation
s = "def";

实际上有一个小的静态内存浪费(不会称之为泄漏)因为你不能再使用 "abc"

但是因为即使调用你的代码所在的例程也不能重复,我绝对不会称之为泄漏。

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

strcpy(s,"def");

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

没有。没有内存泄漏。

您只是将 s 更改为指向不同的字符串文字,这很好(这样:s = "def";)。

简单地说,如果您没有使用 malloc/calloc/realloc 或任何 returns 动态分配内存(和文档)的函数自己分配任何内容告诉你 free()。例如,POSIX 的 getline() 函数就是这样做的),你不需要 free()

您的代码段:

char *s = "abc";
s = "def";

不会造成内存泄漏。 char *s 是内存中的指针。当您使用 char *s = "abc" 时,您设置了一个 *s 可以指向的字符串文字。当您将 s 设置为字符串文字 "def" 时,您所做的只是更改 *s 指向的位置。

注意:你只能用指针数组来做到这一点。如果您想改用数组,则可能需要使用 strcpy(3)/ strncpy(3)

由于您没有分配任何指针,无论是使用 malloc(3)/strdup(3),都很难发生内存泄漏。

但是,这里有一个内存泄漏的例子:

const char *str1 = "abc";
const char *str2 = "def";

char *s1 = malloc(strlen(str1)+1); /* dynamic memory allocation with malloc() */
char *s2 = malloc(strlen(str2)+1);

s1 = s2;

此处您将 ​​s1 设置为 s2。因此,这意味着 s1 的内存位置不再存在,因为 s1 指向 s2,而不是它分配的原始内存位置。您不能再使用 free(3) deal-locate 这个指针,因为它们不再是对其位置的引用。如果您从不 free() 在堆上分配指针,那也会导致内存泄漏。