【问题标题】:what is different between initialization of string and using strdup()初始化字符串和使用 strdup() 有什么不同
【发布时间】:2020-05-04 01:34:10
【问题描述】:

有什么区别

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() 中使用时表现不同?

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

【问题讨论】:

  • 请更改字体类型:)
  • 那是免费字体,
  • 虽然您不应该发布代码图片,但您应该发布minimal reproducible example。问题在于您显示的代码。
  • 您在未显示的代码中执行的操作会导致未定义的行为,从而使您的整个程序出错。该问题与使用指向字符串文字的指针或指向动态分配的字符串的指针之间的区别无关。未定义的行为是未定义的,任何事情都可能发生(包括召唤nasal demons)。

标签: c strcmp strdup


【解决方案1】:

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

char *str = "kiwi";

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

有点等价于

char internal_array_for_kiwi[5] = { 'k', 'i', 'w', 'i', '\0' };
char *str = &internal_array_for_kiwi[0];

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

之后

char *str = strdup("kiwi");

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

相当于

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);

需要强调两者之间的一个重要区别: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);

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


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

【讨论】:

  • 谢谢。在示例中,为什么这些行为不同
  • @alexparkjw 我知道问题所在,但您需要在问题中包含minimal reproducible example。获取您在图像中显示的代码,然后将其作为文本复制粘贴到问题中。
  • github.com/alexparkjw/typing/blob/master/pa2.c , git 中的 src 代码,谢谢
  • @alexparkjw 修复错误后会发生什么?然后链接中的代码不会出现错误行为,您的问题(以及所有答案)将变得毫无价值。请记住,本网站不仅可以帮助您现在,还可以帮助将来与您有相同或相似问题的人。这就是为什么您需要使问题独立,这意味着您需要将代码包含在问题本身中。
  • 详细信息:“C 中的文字字符串不能被修改”更像是“C 中的文字字符串不应该被修改”。尝试修改是 UB - 它可能“工作:,它可能不会,可能会崩溃,等等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-18
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-10
相关资源
最近更新 更多