美好的一天,
我有一些简单的typedef,如下所示:
typedef int dataType;
typedef dataType* arrayOfNPointers[N];
因此,dataType
代表int
,类型arrayOfNPointers
代表N
指向int
的数组。
我是否能够可靠地执行其中一个阵列的内容的深层复制,如下所示:
#define N (2)
arrayOfNPointers a1 = { 1, 2};
arrayOfNPointers a2;
a2 = a1; // Safe?
我知道我可以像这样直接复制struct,而且我知道,一般来说,如果我尝试使用int*
指针进行分配,那么它就有资格作为“浅拷贝”。
在这种情况下,我最终会得到两个包含元素{1, 2}
的独立固定大小数组吗?
谢谢!
答案 0 :(得分:2)
不,您不能将数组分配给另一个。由于您尝试从类型arrayOfPointers
分配到int**
类型,因此该代码甚至无法编译。
考虑一个更简单的例子:
int a1[3] = {1, 2, 3};
int a2[3];
a2 = a1; // will not compile since you're trying to assigning to int[3] from int*
即使你有类型定义的
typedef int IntArray[3];
IntArray a1 = {1, 2, 3};
IntArray a2;
a2 = a1;
这不会编译。
答案 1 :(得分:2)
首先,提防:
arrayOfNPointers a1 = {1, 2};
据我所知,这是初始化指针,好像它们是整数。这不能很好地结束。 (我稍后会更充分地处理这个问题。)
但无论如何:
安全吗?
不。 a1
和a2
都是数组;这意味着,除其他外,它们不能被分配到。
a2 = a1;
// ^^^^ WRONG
即使此 可能[例如]如果它们是指针],这甚至不是一个浅层副本 - 我们假装的两个[数组]指针将指向同一块内存。 [只有结构才能以这种方式进行浅层复制。]
只有使用for循环才能在C中执行正确的数组的 :
for (int i = 0; i < N; ++i) {
a2[i] = a1[i];
}
但是你正在处理指针,所以上面只是真正的浅层副本。你需要更有趣的东西才能正确地深度复制这个数组:
for (int i = 0; i < N; ++i) {
a2[i] = malloc(sizeof(int));
*a2[i] = *a1[i];
}
arrayOfNPointers a1 = {1, 2};
出了什么问题?很多。 {1, 2}
没有初始化指向的整数;它正在初始化指针。
整数数组:
typedef DataType arrayOfIntegers[N];
arrayOfIntegers a1 = {1, 2};
正确初始化指向整数的指针数组:
DataType arr[N] = {1, 2};
arrayOfNPointers a1 = {&a[0], &a[1]};
或者,如果您想使用malloc
内存,并在以后分配它:
arrayOfNPointers a1 = {NULL};
初始化列表的规则确保所有指针最初都为NULL。
答案 2 :(得分:2)
a2 = a1; //安全?
不,该声明甚至不会编译。 你的编译器会开始尖叫。
main.c: error: incompatible types when assigning to type 'arrayOfNPointers' from type 'dataType **'