繁体   English   中英

使用指针复制数组

[英]Copying Array Using Pointers

我试图通过仅使用指针算法访问数组来创建数组的副本。 这是我的功能

 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] 而我不知道为什么。

这个给你

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[sizeof(int)*i]

因此,例如,当i等于1并且sizeof( int )等于4 ,您将获得元素b[4]而不是获取元素b[1] b[4]

来自 C 标准(6.5.2.1 数组下标)

2 后缀表达式后跟方括号 [] 中的表达式是数组对象元素的下标指定。 下标运算符[]的定义是E1[E2]等同于(*((E1)+(E2)))。 由于适用于二元 + 运算符的转换规则,如果 E1 是一个数组对象(相当于一个指向数组对象初始元素的指针)并且 E2 是一个整数,则 E1[E2] 指定第 E2 个元素E1(从零开始计数)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM