【问题标题】:Error: assignment to expression with array type, when assigning values to an array错误:为数组赋值时,赋值给数组类型的表达式
【发布时间】:2020-12-28 02:32:12
【问题描述】:

我想将值插入到数组的最后一个位置。所以,我创建了函数插入。该函数返回新数组。

在这段代码中,我想将value=0 插入array={1} 的最后一个位置,并将新数组分配给我在main 开头声明的数组。

所以我写了:

array = insert(&array[0], value, NUM(array), NUM(array)+1)

但是,我收到了错误:

ERROR:  assignment to expression with array type` in the line:  
`array = insert(&array[0], value, NUM(array), NUM(array)+1);

但如果我声明new_array,则不会发生此错误。

我想知道为什么会出现这种情况以及如何解决。

谢谢。

#include <stdio.h>
#define NUM(a) (sizeof(a) / sizeof(*a))

int * insert(int *, int, int, int);

void main(){
    int array[] = {1};
//  int *new_array;
    int value = 0;
    int num = 3;
    int pos = 2;
    array = insert(&array[0], value, NUM(array), NUM(array)+1);
    int i;
    for(i = 0; i < NUM(array); i++) {
      printf("array[%d] = %d\n", i, array[i]);
   }
}



int * insert(int *p, int a, int N, int pos){
    int i;
//   // now shift rest of the elements downwards    
//  for(i = N; i >= 0; i--) {
//      p[i+1] = p[i];
//  }
    
    // increase the size by 1
    N++;
    
    // shift elements forward
    for (i = N-1; i >= pos; i--)
        p[i] = p[i - 1];
 
    // insert x at pos
    p[pos - 1] = a;
    
    return p;
    
}

【问题讨论】:

  • 您需要分配给数组的一个元素。您不能分配给数组本身。错误消息基本上就是这样说的。所以如果a 是一个数组,你就不能做a = ...。你需要做a[i] = ...
  • 这能回答你的问题吗? Insert element into array C

标签: arrays c assign


【解决方案1】:

在 C 中,数组名称是不可修改左值。您不能将任何内容分配给数组变量。因此,您在此声明中遇到错误:

array = insert(&array[0], value, NUM(array), NUM(array)+1);

new_array 是指针,记住数组和指针是不同的。当您访问一个数组时,它会被转换为指向第一个元素的指针(此规则很少有例外)1).

还要注意

int array[] = {1};

数组array 的大小是1。当您省略数组的维度时,编译器会根据初始化器的大小推断它,并且您正在初始化 array 仅使用一个元素。所以,array 数组是 one int 类型元素的数组。

也就是说,这个

int array[] = {1};

和这个一样

int array[1] = {1};

您将NUM(array)+1 传递给insert() 函数并访问位于pos 索引处的array 元素,其中pos 的值为NUM(array)+1,即访问超出其大小的数组,即undefined behaviour

另外,你不应该使用 void 作为 main() 函数的返回类型。根据 C 语言标准,main() 函数的返回类型应为int


  1. 来自 C11 标准#6.3.2.1p3 [强调添加]

3 除非它是 sizeof 运算符、_Alignof 运算符或一元 & 运算符的操作数,或者是用于初始化数组的字符串字面量,否则将转换类型为 ''array of type'' 的表达式指向类型为“类型指针”的表达式,该表达式指向数组对象的初始元素并且不是左值。 ....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 2020-08-29
    • 2017-06-12
    • 2022-11-24
    相关资源
    最近更新 更多