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