gpt4 book ai didi

c - 为什么我们不能将新字符串分配给 char 数组,而是分配给指针?

转载 作者:行者123 更新时间:2023-12-04 11:42:14 27 4
gpt4 key购买 nike

我试图将一个字符串重新分配给一个预先初始化的数组 a[],但我得到的只是一个错误

main()
{
char a[] = "Sunstroke";
char *b = "Coldwave";

a = "Coldwave";
b = "Sunstroke";
printf("\n %s %s",a,b);
}

[错误]:从类型 'char *' 分配到类型 'char[10]' 时类型不兼容。
char a[] = "Sunstroke";

但它没有用...

但是在指针的情况下,它可以像上面的程序一样..

最佳答案

要了解这里发生的事情,有两个语言规则很重要:

  • 数组不可分配。
  • 数组可以转换为指向其第一个元素的指针。

  • 理解像 "Sunstroke" 这样的字符串字面量也很重要是。它是一个常量字符的静态数组,大到足以容纳以终止符结尾的字符串的所有字符。所以在这种情况下,它是一个 const char[10]数组,包含九个字符,后跟零值终止符。由于是静态的,数组在程序的生命周期内存储在内存中的某处。
    char a[] = "Sunstroke";

    这将创建一个本地数组,并通过从字符串文字中复制字符来初始化它。
    char *b = "Coldwave";

    这将创建一个指针,并将其初始化为指向文字本身。请注意,这是危险的:文字是 const ,但指针不是,因此您可以编写尝试修改文字的代码,从而给出未定义的行为。这种转换已被弃用(当然在 C++ 中,我不确定 C),所以编译器应该给你一个警告。您已经启用了所有可能的编译器警告,不是吗?
    a = "Coldwave";

    这会尝试重新分配数组,但由于数组不可分配而失败。没有特别好的理由为什么他们不是。这就是语言进化的方式。
    b = "Sunstroke";

    这会重新分配指针以指向不同的文字。这很好(除了缺少上面提到的 const)。

    如果您需要操作字符串,则:
  • 在 C 中,您需要仔细创建足够大的数组以满足您的需要,并使用 <string.h> 中的库函数(或您自己编写的代码)来操作这些数组中的字符;
  • 在 C++ 中,使用 std::string为您处理内存管理、分配等的类。
  • 关于c - 为什么我们不能将新字符串分配给 char 数组,而是分配给指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18745374/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com