2

再会,

我有一些简单的 typedef,如下所示:

typedef int dataType;
typedef dataType* arrayOfNPointers[N];

因此,dataType表示int,并且类型表示指向'sarrayOfNPointers的指针数组。Nint

我是否能够可靠地将其中一个数组的内容深拷贝到另一个数组,如下所示:

#define N (2)
arrayOfNPointers a1 = { 1, 2};
arrayOfNPointers a2;

a2 = a1;    // Safe?

我知道我可以像这样直接复制结构,而且我知道一般来说,如果我尝试用int*指针分配它,它只会被称为“浅拷贝”。

在这种情况下,我最终会得到两个包含元素的独立固定大小数组{1, 2}吗?

谢谢!

4

3 回答 3

2

不,您不能将数组分配给另一个数组。由于您尝试arrayOfPointers从 type分配给 type ,因此此代码甚至不会编译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;

这不会编译。

于 2013-05-10T01:21:34.450 回答
2

首先,注意:

arrayOfNPointers a1 = {1, 2};

据我所知,这是初始化指针,就好像它们是整数一样。这不能很好地结束。(我稍后会更全面地处理这个问题。)

但无论如何:

安全的?

没有。a1并且a2都是数组;这意味着,除其他外,它们不能被分配到。

   a2 = a1;
// ^^^^ WRONG

即使这可能的[例如,如果它们是指针],这甚至不会是浅拷贝——两个[我们假装的数组]指针将指向同一个内存块。[只有结构可以通过这种方式进行浅拷贝。]

数组的正确深拷贝只能在 C 中使用 for 循环执行:

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}没有初始化指向的整数;它正在初始化指针。

修复 1

整数数组:

typedef DataType arrayOfIntegers[N];
arrayOfIntegers a1 = {1, 2};

修复 2

正确初始化的指向整数的指针数组:

DataType arr[N] = {1, 2};
arrayOfNPointers a1 = {&a[0], &a[1]};

或者,如果您想使用malloced 内存,然后再分配它:

arrayOfNPointers a1 = {NULL};

初始值设定项列表的规则确保所有指针最初都是 NULL。

于 2013-05-10T01:24:11.907 回答
2

a2 = a1; // 安全的?

不,该语句甚至不会编译。你的编译器会开始尖叫。

main.c: error: incompatible types when assigning to type 'arrayOfNPointers' from type 'dataType **'
于 2013-05-10T01:28:21.467 回答