【问题标题】:Why does an error occur when you try to assign values to an array with arr = {values};?当您尝试使用 arr = {values}; 将值分配给数组时,为什么会发生错误?
【发布时间】:2012-12-08 20:44:16
【问题描述】:

为什么在 C(或 C++)中不允许?

我的意思是:

ucell GetPlayerPosPositionData[5];
GetPlayerPosPositionData = {4*sizeof(cell),playerid,0,sizeof(cell),2*sizeof(cell)};//this does not work, error

//normal assignment
GetPlayerPosPositionData[1] = playerid;
GetPlayerPosPositionData[2] = 0;
GetPlayerPosPositionData[3] = sizeof(cell);
GetPlayerPosPositionData[4] = 2*sizeof(cell);

【问题讨论】:

  • typedef unsigned int ucell;
  • 试试ucell GetPlayerPosPositionData[5] = {4*sizeof(cell),playerid,0,sizeof(cell),2*sizeof(cell)};
  • @otibom,赋值和初始化是两个不同的东西。
  • @Zane 是初始化,不是赋值。

标签: c++ c arrays variable-assignment


【解决方案1】:

因为数组是不可赋值的。您可以在声明时初始化它们,也可以在每个元素的基础上分配它们,仅此而已。这会起作用:

ucell GetPlayerPosPositionData[] = {4*sizeof(cell),
                                    playerid,
                                    0,
                                    sizeof(cell),
                                    2*sizeof(cell)};

【讨论】:

    【解决方案2】:

    因为语法上说不允许?问题有两个部分:

    1. 除了在初始化器中或(在 C99 中)在复合文字中之外,您不能使用初始化器语法。

    2. 您不能分配整个数组。

    在 C99 中,您可以将数组传递给函数:

    typedef unsigned int cell;
    
    extern void some_func(cell data[]);
    
    extern void func(void);
    
    void func(void)
    {
        cell playerid = 0;
        some_func((cell[]){4*sizeof(cell),playerid,0,sizeof(cell),2*sizeof(cell)});
    }
    

    (您的问题在cellucell 上不清楚;我选择自始至终使用cell。)

    你仍然不能做数组赋值。如果数组包含在结构中,您可以执行结构分配,巧合的是,分配包含的数组。但那是结构赋值,不是数组赋值。

    【讨论】:

    • 您实际上并没有将数组传递给some_func。该函数接收指向data 的第一个元素的指针,而不管参数表示法如何。
    • 字面量数组在传递给函数时衰减为指向第一个元素的指针——是的,当然,就像任何其他数组会衰减为指向第一个元素的指针一样。但是复合文字表示法创建了一个文字数组。
    • 是的,当然。我想我对数组及其语义有点过敏,因为很少有人真正理解其中的区别(我知道你知道,评论是针对 OP 和其他人的)。
    • 数组和指针是混乱的根源。另一种看待它的方法是使用extern void another_func(cell (*data)[5]);,这是一个函数,它接受一个指向由5 个cell 值组成的数组的指针。我可以调用:another_func(&(cell[]){4*sizeof(cell),playerid,0,sizeof(cell),2*sizeof(cell)});,如果复合文字不是实际的数组,它将不起作用。
    • 是的。指向数组的指针就更难理解了。
    【解决方案3】:

    该语法用于对数组进行列表初始化。它只能用作数组声明的初始化器:

    ucell GetPlayerPosPositionData[5] = {4*sizeof(cell),playerid,0,sizeof(cell),2*sizeof(cell)};
    

    另一种方法是单独分配给每个元素:

    ucell GetPlayerPosPositionData[5];
    GetPlayerPosPositionData[0] = 4 * sizeof(cell);
    GetPlayerPosPositionData[1] = playerid;
    GetPlayerPosPositionData[2] = 0;
    GetPlayerPosPositionData[3] = sizeof(cell);
    GetPlayerPosPositionData[4] = 2 * sizeof(cell);
    

    【讨论】:

      【解决方案4】:

      我会让语言律师对此进行辩论。假设array 被声明为int array[4],并且您希望分配给它。然后考虑:

      * (struct t { int array[4]; } *) array = (struct t) {{ 0, 1, 2, 3 }};
      

      【讨论】:

        猜你喜欢
        • 2016-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-20
        • 1970-01-01
        • 2014-12-20
        • 1970-01-01
        • 2014-08-02
        相关资源
        最近更新 更多