你好,
我有一些像这样的简单类型定义:
typedef int dataType;
typedef dataType* arrayOfNPointers[N];
因此,dataType
表示 int
,类型 arrayOfNPointers
表示 N
指针数组 >int
的。
我是否能够像这样可靠地将这些数组之一的内容深拷贝到另一个数组:
#define N (2)
arrayOfNPointers a1 = { 1, 2};
arrayOfNPointers a2;
a2 = a1; // Safe?
我知道我可以像这样直接复制结构,而且我知道一般来说,如果我尝试用 int*
指针分配它,它就符合“浅拷贝”的条件".
在这种情况下,我最终会得到两个包含元素 {1, 2}
的独立的固定大小数组吗?
谢谢!
最佳答案
首先,注意:
arrayOfNPointers a1 = {1, 2};
据我所知,这是将指针初始化为整数。这不能很好地结束。 (稍后我会更全面地处理这个问题。)
但无论如何:
Safe?
没有。 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]};
或者,如果您想使用 malloc
ed 内存,然后再分配它:
arrayOfNPointers a1 = {NULL};
初始化列表的规则确保所有指针最初都是 NULL。
关于c - typedef 的指针数组 - 复制值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16473592/