C 整数数组的深度副本,仅使用指针算法
我需要写一个函数来生成整数数组的深度副本, 仅使用指针算法(即不能使用类似orig[i]的数组元素语法) 第一个参数是要复制的数组,其长度由第二个参数指定 以下是我到目前为止的情况: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 = © for (int i = 0; i < size; i++, or
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
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;
}