C中的数组切片

时间:2014-12-31 18:56:07

标签: c arrays

在Python中,如果我想将向量x=(1,2)分配给y=(0,0,0,0)的前两个元素,我会做y[:1] = x之类的事情。 C中是否有等价物为可用double x[2]={1.,2.}的前两个元素分配double y[4] = {0.,0.,0.,0.}?或者我必须循环吗?

4 个答案:

答案 0 :(得分:2)

试试这个

#include <string.h>
#include <stdio.h>

int main()
{
    double x[2] = {1., 2.};
    double y[4] = {0., 0., 0., 0.};

    memcpy(y, x, 2 * sizeof(*x));
              /* ^ 2 elements of size -> sizeof(double) */

    return 0;
}

而不是写sizeof(double)这是好的,我做了sizeof(*x),因为如果我更改了x的类型,我就不需要修复memcpy,但在这种情况下,我还必须更改y的类型。

答案 1 :(得分:1)

您可以编写一个传入指针或数组的函数,一个偏移量和一个长度。然后函数使用malloc()为新指针分配空间并执行memcpy()操作或循环复制,尽管memcpy()可能更好。新指针返回给调用者。

答案 2 :(得分:0)

是的,可以使用函数memcpy。但是你必须要小心数据类型。您还可以将一种类型的数据复制到另一种类型。正如我所说,你需要小心。否则可能会产生垃圾值。

第二个选项是循环,如上所述。

答案 3 :(得分:0)

试试这个。比你的python方法更低级别,但欢迎使用C迟早所有东西都是原始内存块被分流!

宏arraycopy应用了一些大小检查。 函数arraycopyunchecked相当原始。

功能重叠安全。在引擎盖下,他们使用memcopy(,,)可能会更慢,但如果意外的别名导致重叠的阵列,则不会有意外结果。

#include <stdio.h>
#include <stdlib.h>
#include <string.h> //includes mempcy. I know! I know!

#define arraycopy(dest,doffset,source,soffset,count) arraycopy_((dest),(doffset),(source),(soffset),(count),sizeof(*(dest)),sizeof(*(source)))

int  arraycopy_(void*const dest,const size_t doffset,const void*const source, const size_t soffset,const size_t count,const size_t size,const size_t sizecheck){ 
    if(size!=sizecheck){
        return 1;//Incompatible types.
    }
    memcopy(((char*)dest)+doffset*size,((const char*)source)+soffset*size,count*size);
    return 0;
}

int  arraycopyunchecked(void*const dest,const size_t doffset,const void*const source, const size_t soffset,const size_t count,const size_t size){ 
    memcopy(((char*)dest)+doffset*size,((const char*)source)+soffset*size,count*size);
    return 0;
}


int main(void) {

    int errors=0;

    double dest[]={0.0,0.0,0.0,0.0};
    double source[]={1.0,2.0};

    arraycopy(dest,0,source,0,2);

    if(dest[0]!=1.0){
        ++errors;
    }

    if(dest[1]!=2.0){
        ++errors;
    }   

    if(dest[2]!=0.0){
        ++errors;
    }   

    arraycopy(dest,1,source,0,2);

    if(dest[0]!=1.0){
        ++errors;
    }

    if(dest[1]!=1.0){
        ++errors;
    }   

    if(dest[2]!=2.0){
        ++errors;
    }   


    if(errors!=0){
        printf("Errors - %d\n",errors);
    }else{
        printf("SUCCESS");
    }

    double dest1[]={0.0,0.0,0.0,0.0,0.0};
    double source1[]={1.0,2.0,3.0};

    arraycopy(dest1,2,source1,1,2);

    if(dest[2]!=2.0){
        ++errors;
    }

    if(dest[3]!=3.0){
        ++errors;
    }

   return errors==0?EXIT_SUCCESS:EXIT_FAILURE;
}