6

如果我声明两个数组 -arr1并且arr2- 例如,int每个大小为 10 的类型,并初始化第一个数组,并且我希望创建arr1in的副本arr2;为什么我不能直接给出指示arr2 = arr1

我知道可以分配两个相同类型的结构。为什么数组不是这种情况?

4

4 回答 4

9

数组的问题在于,在所有表达式中(传递给 thesizeof和一元运算符时除外&),它们都转换为指向其第一个元素的指针。

所以,假设你有:

int arr1[10];
int arr2[10];
...

然后,如果你写类似

arr1 = arr2;

您实际上是在尝试这样做:

arr1 = &arr2[0];

或这个:

&arr1[0] = &arr2[0];

在这两种情况下,您都会遇到阻止代码编译的问题。在前一种情况下,您尝试在两种不兼容的类型(数组与指针)之间进行分配,而在后一种情况下,您尝试修改常量指针(&arr1[0])。

于 2013-02-12T08:24:53.983 回答
8

实际上他们可以,但以间接的方式:

#include <stdio.h>

int main(){
  int arr1[3] = {0};
  int arr2[3] = {1, 2, 3};

  struct tmp{
      int arr[3];
  };

  printf("%d %d %d\n", arr1[0], arr1[1], arr1[2]);

  // casting array to address of struct
  // before dereferencing & asigning to it
  *(struct tmp*)arr1 = *(struct tmp*)arr2;

  printf("%d %d %d\n", arr1[0], arr1[1], arr1[2]);

  return 0;
}

你甚至可以用更通用的方式来制作它:

#include <stdio.h>

#define STRUCT_TO(type, size) struct temp##__LINE__{type arr[size];}; *(struct temp##__LINE__*)
#define STRUCT_FROM *(struct temp##__LINE__*)

int main(){
  int arr1[3] = {0};
  int arr2[3] = {1, 2, 3};

  printf("%d %d %d\n", arr1[0], arr1[1], arr1[2]);

  STRUCT_TO(int,3) arr1 = STRUCT_FROM arr2;

  printf("%d %d %d\n", arr1[0], arr1[1], arr1[2]);

  return 0;
}

或者......如果我们可以牺牲一些可移植性,那么我们可以使语法更加对称:

#include <stdio.h>

#define ARRAY_LENGTH(arr) (sizeof(arr)/sizeof(arr[0]))
#define TEMP_STRUCT struct temp##__LINE__
#define AS_STRUCT_DESTINATION(arr) TEMP_STRUCT{typeof(arr[0]) arrTmp[ARRAY_LENGTH(arr)];}; *(TEMP_STRUCT*) arr
#define AS_STRUCT_SOURCE(arr) *(TEMP_STRUCT*) arr

int main(){
  int arr1[3] = {0};
  int arr2[3] = {1, 2, 3};

  printf("%d %d %d\n", arr1[0], arr1[1], arr1[2]);

  AS_STRUCT_DESTINATION(arr1) = AS_STRUCT_SOURCE(arr2);

  printf("%d %d %d\n", arr1[0], arr1[1], arr1[2]);

  return 0;
}
于 2013-02-12T07:11:44.940 回答
0

如果变量是指向数组的指针,则不能将数组分配给另一个数组。即使在这种情况下,您也不会创建副本,而只会创建指向同一数组的另一个指针。

要复制数组,您应该使用 memcpy() 复制整个内容:

int a[3] = {1,2,3};
int b[3];
memcpy(b, a, sizeof(a));
于 2013-02-12T07:19:07.510 回答
-1

在 C 中,数组类型不保存大小,因此如果a有类型int[]并且b有类型int[],则计算a == b我们需要知道 和 的实际大小,ab在编译时和运行时都不知道。

于 2013-02-12T06:48:43.183 回答