typedef'd指针数组 - 复制值

时间:2013-05-10 01:02:06

标签: c arrays pointers typedef

美好的一天,

我有一些简单的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}的独立固定大小数组吗?

谢谢!

3 个答案:

答案 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};

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

但无论如何:

  

安全吗?

不。 a1a2都是数组;这意味着,除其他外,它们不能被分配到。

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

修复1

整数数组:

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

修复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 **'