字符串初始化和使用 strdup() 有什么不同

ale*_* jw -1 c strdup strcmp

之间有什么区别

char *key_str="kiwi";
Run Code Online (Sandbox Code Playgroud)

char *key_str = strdup("kiwi");
Run Code Online (Sandbox Code Playgroud)

例如:

int strCmp(void *vp1, void *vp2) {
    char * s1 = (char *) vp1;
    char * s2 = (char *) vp2;
    return strcmp(s1, s2);
}
Run Code Online (Sandbox Code Playgroud)

为什么这些*key_str在函数中使用时表现不同strCmp()

源代码:https : //github.com/alexparkjw/typing/blob/master/pa2.c

Som*_*ude 5

在 C 中,所有文字字符串实际上都是(实际上是只读的)字符数组。

char *str = "kiwi";
Run Code Online (Sandbox Code Playgroud)

str指向这样一个数组的第一个元素。

它有点相当于

char internal_array_for_kiwi[5] = { 'k', 'i', 'w', 'i', '\0' };
char *str = &internal_array_for_kiwi[0];
Run Code Online (Sandbox Code Playgroud)

strdup函数动态分配内存并将传递的字符串复制到此内存中,创建字符串的副本。

所以之后

char *str = strdup("kiwi");
Run Code Online (Sandbox Code Playgroud)

你有两个包含相同内容的数组。

它相当于

char internal_array_for_kiwi[5] = { 'k', 'i', 'w', 'i', '\0' };
char *str = malloc(strlen(internal_array_for_kiwi) + 1);
strcpy(str, internal_array_for_kiwi);
Run Code Online (Sandbox Code Playgroud)

需要强调两者之间的一个重要区别:C 中的文字字符串不能被修改。尝试修改这样的字符串将导致未定义的行为。数组不是const,但实际上是只读的。

如果您创建自己的数组(作为数组或动态分配),那么您可以根据需要修改其内容,只要您不越界或更改字符串空终止符。

所以如果我们有

char *str1 = "kiwi";
char *str2 = strdup("kiwi");
Run Code Online (Sandbox Code Playgroud)

然后

str1[0] = 'l';  // Undefined behavior, attempting to modify a literal string
str2[0] = 'l';  // Valid, strdup returns memory you can modify
Run Code Online (Sandbox Code Playgroud)

由于字面量字符串无法修改,建议您const char *在指向它们时使用:

const char *str1 = "kiwi";
Run Code Online (Sandbox Code Playgroud)

另一件重要的事情要记住:由于strdup动态分配内存(使用mallocfree,一旦完成字符串,您就需要该内存:

free(str2);
Run Code Online (Sandbox Code Playgroud)

如果你不释放内存,那么你就会有内存泄漏。


除了上述之外,这两种变体之间没有有效的区别。例如,在调用函数时,两者可以互换使用。

  • 详细信息:“C 中的文字字符串不能被修改”更像是“C 中的文字字符串不应被修改”。尝试修改是 UB - 它可能“工作:,它可能不工作,可能会崩溃,等等。 (4认同)