【发布时间】:2018-10-04 13:21:01
【问题描述】:
我正在努力更好地理解 memcpy。这是我正在试验的一个例子:
int arr[] = {10, 20, 30, 40};
int dest[] = {1, 2, 3, 4};
void *ptr = &dest;
printf("Before copy: %d, %d, %d, %d\n", *(int*)ptr, *(int*)ptr + 1, *(int*)ptr + 2, *(int*)ptr + 3);
memcpy(dest, arr, 3*sizeof(int));
printf("After copy: %d, %d, %d, %d\n", dest[0], dest[1], dest[2], dest[3]);
printf("After copy: %d, %d, %d, %d\n", *(int*)ptr, *(int*)ptr + 1, *(int*)ptr + 2, *(int*)ptr + 3);
我如何从最后两个打印语句中得到不同的结果?第一个行为符合我的预期,但第二个则不然。
【问题讨论】:
-
*(int*)ptr + n周围缺少括号。我想你的意思是*(int*)(ptr + n)。 -
3*sizeof(int)? 3次? -
void *ptr = &dest为什么不int*?然后你可以删除所有(int*)演员表。喜欢int* ptr = &dest[0];或干脆int* ptr = dest; -
@4386427 我选择了 void ptr,因为我看到 memcpy 在参数中接受 void: void *memcpy(void *s1, const void *s2, size_t n);不过我看只要 s1 和 s2 是同一个类型,没关系。
-
@Maydayfluffy 这只是意味着
memcpy接受任何类型的对象指针。它们都可以隐式转换为void *。