仅使用指针算法的整数数组的深层副本

时间:2016-10-09 23:14:38

标签: c arrays pointers malloc

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

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

这是我到目前为止所做的:

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

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

  int **toReturn = ©

  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

0 0xe1301c
0 0xe13020
0 0xe13024

应该是:

1 0x7ffce0ff6fd0
2 0x7ffce0ff6fd4
3 0x7ffce0ff6fd8

1 0xe1301c
2 0xe13020
3 0xe13024

我是指针和内存分配的新手...... 我做错了什么?

更新:问题已解决!

看看我的答案,或其他有效的答案。

2 个答案:

答案 0 :(得分:2)

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 );
}

在风格上,我个人喜欢ii而不是i。搜索i很困难。对于用于描述某事物大小的内容,size_t是比int更好的选择。

如果malloc返回NULL,您可能应该添加一些错误检查。

并且,没有索引指针(因为简单的代码将被禁止?!?)

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

    memcpy( copy, orig, size * sizeof( *copy ) );
    return( copy );
}

无论如何,这可能更快。正确的标题包含留给读者作为exersize ...; - )

但仍然需要进行错误检查。

答案 1 :(得分:1)

这是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;

}