【问题标题】:Char array declaration and initialization in CC中的字符数组声明和初始化
【发布时间】:2011-06-26 01:41:33
【问题描述】:

我很好奇为什么在 C 中不允许这样做:

char myarray[4];

myarray = "abc";

这是允许的:

char myarray[4] = "abc";

我知道在第一种情况下我应该使用 strcpy

char myarray[4];

strcpy(myarray, "abc");

但是为什么不允许声明和稍后的初始化,而允许声明和同时初始化呢?和C程序的内存映射有关系吗?

谢谢!

【问题讨论】:

    标签: c arrays char


    【解决方案1】:

    那是因为你的第一个代码 sn-p 没有执行初始化,而是赋值

    char myarray[4] = "abc";  // Initialization.
    
    myarray = "abc";          // Assignment.
    

    并且数组在 C 中不能直接赋值。

    名称 myarray 实际上解析为其第一个元素的地址 (&myarray[0]),它不是 lvalue,因此不能作为分配的目标。

    【讨论】:

    • &myarray[0] 不是左值?但我认为左值只是一个内存位置。这种情况下的问题是myarrayconst,而不是它不是左值。
    • @Dave,左值是一个“内存位置”,这就是为什么&myarray[0] 不是左值——它是一个地址,而不是它指向的内存位置。
    【解决方案2】:

    是的,这是语言上的一种不一致。

    myarray = "abc"; 中的“=”是赋值(它不起作用,因为数组基本上是一种常量指针),而在 char myarray[4] = "abc"; 中它是数组的初始化。 “后期初始化”是没有办法的。

    你应该记住这条规则。

    【讨论】:

    • 此时没有不一致。 marray 是一个数组而不是一个指针,仅此而已。
    • @Jens:不一致之处在于初始化在语法上与赋值相同。这正是导致误解的原因。
    • 那个语法只有一个快捷方式。我认为char myarray[4] = { "abc" }; 让事情变得更加清晰和明确。
    • @Jens:您在最后一条评论中提到的语法与 OP 正在讨论的语法不同。这种语法当然不会那么模棱两可。在我看来,初始化和赋值在视觉上是不同的,这应该是对开发人员的一个很好的暗示,即它们并不相同。语法可能是char myarray[4]("abc"); 或类似的东西。
    【解决方案3】:
    myarray = "abc";
    

    ...是将“abc”上的指针分配给指针 myarray。

    这不是用“abc”填充 myarray 缓冲区。

    如果要手动填充 myarray 缓冲区,不使用 strcpy(),可以使用:

    myarray[0] = 'a', myarray[1] = 'b', myarray[2] = 'c', myarray[3] = 0;
    

    char *ptr = myarray;
    *ptr++ = 'a', *ptr++ = 'b', *ptr++ = 'c', *ptr = 0;
    

    您的问题是关于指针和缓冲区(数组)之间的区别。 我希望您现在了解 C 是如何处理各种类型的。

    【讨论】:

    • "...是将 "abc" 上的指针分配给指针 myarray。" myarray 是一个数组,而不是一个指针。
    • 您不想使用签名。您已经在答案下方找到了一个。
    • @Raynos:它们非常相似,但又不一样。
    【解决方案4】:

    这是另一个 C 示例,其中相同的语法具有不同的含义(在不同的地方)。虽然有人可能会争辩说这两种情况的语法应该不同,但事实就是如此。这个想法不是说它是“不允许的”,而是第二件事意味着不同的东西(它意味着“指针分配”)。

    【讨论】:

      【解决方案5】:

      我认为这是两种截然不同的情况。在第一种情况下,内存是在编译时分配和初始化的。在第二个 - 在运行时。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-12
        • 2013-10-22
        • 2021-04-15
        • 2011-06-17
        相关资源
        最近更新 更多