C 整数数组的深度副本,仅使用指针算法

C 整数数组的深度副本,仅使用指针算法,c,arrays,pointers,malloc,C,Arrays,Pointers,Malloc,我需要写一个函数来生成整数数组的深度副本, 仅使用指针算法(即不能使用类似orig[i]的数组元素语法) 第一个参数是要复制的数组,其长度由第二个参数指定 以下是我到目前为止的情况: int* copyArray(const int *orig, int size) { int *copy = malloc(size * sizeof *copy); int **toReturn = &copy; for (int i = 0; i < size; i++, or

我需要写一个函数来生成整数数组的深度副本, 仅使用指针算法(即不能使用类似orig[i]的数组元素语法)

第一个参数是要复制的数组,其长度由第二个参数指定

以下是我到目前为止的情况:

int* copyArray(const int *orig, int size) {

  int *copy = malloc(size * sizeof *copy);

  int **toReturn = &copy;

  for (int i = 0; i < size; i++, orig++, copy++) {
    *copy = *orig;
  }

  return *toReturn;

}

int main () {

  int testArray[3] = {1, 2, 3};
  int *testptr = testArray;

  int *copied = copyArray(testptr, 3);

  for (int i = 0; i < 3; i++) {

    printf("%d %p", testArray[i], &testArray[i]);
    printf("\n");

  }

  printf("\n");

  for (int i = 0; i < 3; i++) {

    printf("%d %p", copied[i], &copied[i]);
    printf("\n");

  }

return 0;
}
鉴于它应该是:

1 0x7ffce0ff6fd0
2 0x7ffce0ff6fd4
3 0x7ffce0ff6fd8

1 0xe1301c
2 0xe13020
3 0xe13024
我不熟悉指针和内存分配。。。 我做错了什么

更新:问题已修复


看看我的答案,或者其他同样有效的答案

copyArray
更改为

int *copyArray( const int *orig, size_t size )
{
    int *copy = malloc(size * sizeof( *copy ) );

    for ( size_t ii = 0; ii < size; ii++ )
    {
        copy[ ii ] = orig[ ii ];
    }
    return( copy );
}
无论如何,这可能更快。适当的页眉包含内容将作为一个大小留给读者…;-)


不过,它仍然需要进行错误检查。

这是copyArray函数的工作版本:

int* copyArray(const int *orig, int size) {

  int *copy = malloc(size * sizeof *copy);

  int *toReturn = copy;

  for (int i = 0; i < size; i++, orig++, copy++) {
    *copy = *orig;
  }

  return toReturn;

}
int*copyArray(常量int*orig,int-size){
int*copy=malloc(大小*sizeof*copy);
int*toReturn=复制;
对于(int i=0;i
您正在递增
copy
,因此当您返回它时,它指向数组的末尾。而且,您只分配了3个字节的内存;它应该是
malloc(大小*sizeof*copy)
。发现第三个问题:在
copyArray()
中的for循环中使用
size
,而不是
3
。谢谢@potrzebie!我做了你推荐的更改。。。但我还是得到了同样的结果。不过,我不确定我是否对return语句做了正确的更改。请看一看!更新。@RockAndaHardPlace您不能使用行
copy++
。这会更改您返回的值。您从
malloc
获取的
copy
值需要从
copyArray
函数中原封不动地返回。@AndrewHenle我发布了一些更新,我认为这些更新解决了您的问题,但我仍然得到了相同的结果。:(请看更新后的问题。您要返回数组的结尾,您需要返回在您执行
copy++
之前所指向的
copy
。另外
toreReturn
是多余的,您现在拥有的与
return copy;
相同。谢谢!这很可能会起作用,但我不允许使用数组元素sy。)像我在问题中提到的ntax一样复制[ii]。@RockAndaHardPlace我不允许使用像我在问题中提到的复制[ii]一样的数组元素语法。好的,我不会问为什么。简单的解决方法…再次感谢,@Andrewenie!
int *copyArray( const int *orig, size_t size )
{
    int *copy = malloc(size * sizeof( *copy ) );

    memcpy( copy, orig, size * sizeof( *copy ) );
    return( copy );
}
int* copyArray(const int *orig, int size) {

  int *copy = malloc(size * sizeof *copy);

  int *toReturn = copy;

  for (int i = 0; i < size; i++, orig++, copy++) {
    *copy = *orig;
  }

  return toReturn;

}