我试图通过仅使用指针算法访问数组来创建数组的副本。这是我的功能
int* arrCopy(int *a, int size){
int *b = (int*)malloc(size*sizeof(int));
for(int i = 0; i < size; i++){
*(b+(sizeof(int)*i)) = *(a+(sizeof(int)*i));
}
return b;
}
当我打印数组时,它表明复制的数组充满了原始数组中前两个值的重复。因此,如果原始数组为[1,2,3,4,5],则arrcopy将为[1,2,1,2,1],我不知道为什么。
答案 0 :(得分:1)
您在这里
int * arrCopy( const int *a, size_t n )
{
int *b = malloc( n * sizeof( int ) );
for ( size_t i = 0; i < n; i++ )
{
*( b + i ) = *( a + i );
}
return b;
}
或者您可以检查内存是否已成功分配。
int * arrCopy( const int *a, size_t n )
{
int *b = malloc( n * sizeof( int ) );
if ( b != NULL )
{
for ( size_t i = 0; i < n; i++ )
{
*( b + i ) = *( a + i );
}
}
return b;
}
这是一个演示程序
#include <stdio.h>
#include <stdlib.h>
int * arrCopy( const int *a, size_t n )
{
int *b = malloc( n * sizeof( int ) );
if ( b != NULL )
{
for ( size_t i = 0; i < n; i++ )
{
*( b + i ) = *( a + i );
}
}
return b;
}
int main(void)
{
int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
const size_t N = sizeof( a ) / sizeof( *a );
int *b = arrCopy( a, N );
if ( b != NULL )
{
for ( size_t i = 0; i < N; i++ )
{
printf( "%d ", b[i] );
}
putchar( '\n' );
}
free( b );
return 0;
}
其输出为
0 1 2 3 4 5 6 7 8 9
至于您的代码,例如此表达式
*(b+(sizeof(int)*i))
无效。它选择与b等效的数组b的元素
b[sizeof(int)*i]
因此,例如,当i
等于1
且sizeof( int )
等于4
时,则不是获得元素b[1]
,而是获得元素{ {1}}。
根据C标准(6.5.2.1数组下标)
2后缀表达式,后跟方括号[] 是数组对象元素的下标名称。 下标运算符[]的定义是E1 [E2]与 (*((E1)+(E2)))。因为适用于 二进制+运算符,如果E1是数组对象(相当于一个指针) 到数组对象的初始元素),并且E2是整数, E1 [E2]表示E1的第E2个元素(从零开始计数)。