在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.}
?或者我必须循环吗?
答案 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;
}