如果我声明两个数组 - arr1
和arr2
- 例如,每个类型为int
,并初始化第一个数组,我希望创建一个{在arr1
中{1}};为什么我不能给出arr2
指令?
我知道可以分配两种相同类型的结构。为什么数组不是这种情况?
答案 0 :(得分: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;
}
答案 1 :(得分:7)
数组的问题在于,在所有表达式中(传递给sizeof
和一元&
运算符除外)它们转换为指向第一个元素的指针。
所以,假设你有:
int arr1[10];
int arr2[10];
...
然后,如果你写了像
这样的东西arr1 = arr2;
你实际上是在尝试这样做:
arr1 = &arr2[0];
或者这个:
&arr1[0] = &arr2[0];
在这两种情况下,您都会遇到阻止代码编译的问题。在前一种情况下,您尝试在两个不兼容的类型(数组与指针)之间进行分配,而在后一种情况下,您尝试修改常量指针(&arr1[0]
)。
答案 2 :(得分:0)
如果变量是指向数组的指针,则无法将数组分配给另一个数组。即使在这种情况下,您也不会创建副本,而只能创建指向同一阵列的另一个指针。
要复制数组,您应该使用memcpy():
复制整个内容int a[3] = {1,2,3};
int b[3];
memcpy(b, a, sizeof(a));
答案 3 :(得分:-1)
在C中,数组类型不具有大小,因此如果a
类型为int[]
而b
类型为int[]
,则计算a == b
我们需要了解a
和b
的实际大小,这些大小在编译时和运行时都不知道。