Tom*_*mas 18 c arrays sizeof memcpy
我想将一个int数组复制到另一个int数组.它们使用相同的长度定义,因此它们总是具有相同的长度.
memcpy()的size参数的以下两个替代方法的优缺点是什么?
memcpy(dst, src, ARRAY_LENGTH*sizeof(int));
Run Code Online (Sandbox Code Playgroud)
要么
memcpy(dst, src, sizeof(dst));
Run Code Online (Sandbox Code Playgroud)
第二种选择总能奏效吗?无论内容如何?
有利于最后一件事的一件事是,如果阵列要改变,那么更新memcpy()将是一些内容管理.
谢谢
Tim*_*mbo 28
只要dst声明为具有sizeof大小的数组,将以字节为单位返回该数组的大小:
int dst[ARRAY_LENGTH];
memcpy( dst, src, sizeof(dst) ); // Good, sizeof(dst) returns sizeof(int) * ARRAY_LENGTH
Run Code Online (Sandbox Code Playgroud)
如果dst恰好是指向这样一个数组的第一个元素的指针(与数组本身的类型相同),它就不会起作用:
int buffer[ARRAY_LENGTH];
int* dst = &buffer[0];
memcpy( dst, src, sizeof(dst) ); // Bad, sizeof(dst) returns sizeof(int*)
Run Code Online (Sandbox Code Playgroud)
如果使用 malloc 分配,则必须说明数组的大小
int * src = malloc(ARRAY_LENGTH*sizeof(*src));
int * dst1 = malloc(ARRAY_LENGTH*sizeof(*dst1));
memcpy(dst1,src,ARRAY_LENGTH*sizeof(*dst1));
Run Code Online (Sandbox Code Playgroud)
如果您分配了静态数组,则可以使用sizeof
int dst2[ARRAY_LENGTH];
memcpy(dst2,src,sizeof(dst2));
Run Code Online (Sandbox Code Playgroud)
sizeof(dst)只有dst在编译时已知大小的数组才是正确的:like int arr[ARRAY_LENGTH]或C99可变长度数组; 否则它返回指针的大小,而不是目标数组的长度.
为了避免将来出现错误,请保持一致并优先选择第一种形式:类型*长度的大小.
如果当你有一个阵列(真实的),你可以使用sizeof(array)技巧,但请注意,如果你重构代码和地方推动它在阵列已经腐朽为指针(或如果内存最初分配的指针(的malloc/new)你需要传递一个已知的大小.
忽略源和目标的相对大小,也就是说,假设它们是讨论的其余部分是相同的,如果你使用的是C++,我会建议一个元编程技巧,会给你一个类型安全的尺寸计数阵列和将无法如果你尝试使用指针编译:
template <typename T, int N>
inline int array_memory_size( T (&a)[N] ) { return sizeof a; }
Run Code Online (Sandbox Code Playgroud)
那样:
int main() {
int array[10];
int *ptr = array;
int orig[10] = { 0 };
memcpy( array, orig, array_memory_size(array) ); // ok
//memcpy( ptr, orig, array_memory_size(ptr) ); // compilation error
}
Run Code Online (Sandbox Code Playgroud)
如果您在任何时候重构并且代码移动到数组已经衰减的地方(或者您为动态分配的静态数组替换静态数组),编译器将告诉您需要更正大小计算.