我需要编写一个函数来生成整数数组的深层副本, 仅使用指针算法(即不能使用像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
我是指针和内存分配的新手...... 我做错了什么?
更新:问题已解决!
看看我的答案,或其他有效的答案。
答案 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;
}