试试这个。比你的 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;
}