c - typedef 的指针数组 - 复制值

标签 c arrays pointers 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?

我知道我可以像这样直接复制结构,而且我知道一般来说,如果我尝试用 int* 指针分配它,它就符合“浅拷贝”的条件".

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

谢谢!

最佳答案

首先,注意:

arrayOfNPointers a1 = {1, 2};

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

但无论如何:

Safe?

没有。 a1a2 都是数组;这意味着,除其他事项外,它们不能分配给。

   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。

关于c - typedef 的指针数组 - 复制值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16473592/

相关文章:

c - 函数不打印结果

c - 使用 getchar() 时的额外循环和 getchar() 的行为

arrays - 由于另一个数组,Ruby 空数组在迭代中更改值

c - 执行另一个程序 + child 死亡

php - 带有数组的可变变量

javascript - 将数据推送到数组填充 jqGrid

c - 插入排序调试帮助

c - 指针和 struct c

c - printf 的打印效果与 fprintf 不同

C:二分查找 Char(名称)