字符串初始化和使用 strdup() 之间有什么不同
what is different between initialization of string and using strdup()
有什么区别
char *key_str="kiwi";
和
char *key_str = strdup("kiwi");
例如:
int strCmp(void *vp1, void *vp2) {
char * s1 = (char *) vp1;
char * s2 = (char *) vp2;
return strcmp(s1, s2);
}
为什么那些 *key_str
在函数 strCmp()
中使用时表现不同?
在 C 中,所有文字字符串实际上都是(有效只读的)字符数组。
有
char *str = "kiwi";
你让 str
指向这样一个数组的第一个元素。
有点等同于
char internal_array_for_kiwi[5] = { 'k', 'i', 'w', 'i', '[=11=]' };
char *str = &internal_array_for_kiwi[0];
strdup
函数动态分配内存并将传递的字符串复制到该内存中,创建字符串的副本。
之后
char *str = strdup("kiwi");
您有 两个 个包含相同内容的数组。
相当于
char internal_array_for_kiwi[5] = { 'k', 'i', 'w', 'i', '[=13=]' };
char *str = malloc(strlen(internal_array_for_kiwi) + 1);
strcpy(str, internal_array_for_kiwi);
需要强调两者之间的一个重要区别:不能修改 C 中的文字字符串。尝试修改此类字符串将导致 未定义的行为 。这些数组不是 const
,但实际上是只读的。
如果您创建自己的数组(作为数组或动态分配),那么您可以随意修改其内容,只要您不越界或更改字符串空终止符即可。
所以如果我们有
char *str1 = "kiwi";
char *str2 = strdup("kiwi");
然后
str1[0] = 'l'; // Undefined behavior, attempting to modify a literal string
str2[0] = 'l'; // Valid, strdup returns memory you can modify
因为文字串不能被修改,建议在指向的时候使用const char *
:
const char *str1 = "kiwi";
另一件需要记住的重要事情:由于 strdup
动态分配内存(使用 malloc
),您需要 free
在完成字符串后分配内存:
free(str2);
如果不释放内存,就会发生内存泄漏。
除此之外,这两个变体之间没有明显的区别。例如,在调用函数时,两者可以互换使用。
有什么区别
char *key_str="kiwi";
和
char *key_str = strdup("kiwi");
例如:
int strCmp(void *vp1, void *vp2) {
char * s1 = (char *) vp1;
char * s2 = (char *) vp2;
return strcmp(s1, s2);
}
为什么那些 *key_str
在函数 strCmp()
中使用时表现不同?
在 C 中,所有文字字符串实际上都是(有效只读的)字符数组。
有
char *str = "kiwi";
你让 str
指向这样一个数组的第一个元素。
有点等同于
char internal_array_for_kiwi[5] = { 'k', 'i', 'w', 'i', '[=11=]' };
char *str = &internal_array_for_kiwi[0];
strdup
函数动态分配内存并将传递的字符串复制到该内存中,创建字符串的副本。
之后
char *str = strdup("kiwi");
您有 两个 个包含相同内容的数组。
相当于
char internal_array_for_kiwi[5] = { 'k', 'i', 'w', 'i', '[=13=]' };
char *str = malloc(strlen(internal_array_for_kiwi) + 1);
strcpy(str, internal_array_for_kiwi);
需要强调两者之间的一个重要区别:不能修改 C 中的文字字符串。尝试修改此类字符串将导致 未定义的行为 。这些数组不是 const
,但实际上是只读的。
如果您创建自己的数组(作为数组或动态分配),那么您可以随意修改其内容,只要您不越界或更改字符串空终止符即可。
所以如果我们有
char *str1 = "kiwi";
char *str2 = strdup("kiwi");
然后
str1[0] = 'l'; // Undefined behavior, attempting to modify a literal string
str2[0] = 'l'; // Valid, strdup returns memory you can modify
因为文字串不能被修改,建议在指向的时候使用const char *
:
const char *str1 = "kiwi";
另一件需要记住的重要事情:由于 strdup
动态分配内存(使用 malloc
),您需要 free
在完成字符串后分配内存:
free(str2);
如果不释放内存,就会发生内存泄漏。
除此之外,这两个变体之间没有明显的区别。例如,在调用函数时,两者可以互换使用。