c - 在 memcpy 之后检查数组

标签 c memcpy

我正在尝试更好地理解 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);

我如何从最后两个打印语句中得到不同的结果?第一个行为符合我的预期,但第二个行为不符合我的预期。

最佳答案

您对第一个 printf 感到困惑,只是因为 dest 是用连续的整数初始化的。尝试

int dest[] = { 4, 72, 0, -5 };

相反。

您真正的问题是运算符优先级:*a + b 解析为 (*a) + b,而不是 *(a + b)(后者等同于 a[b])。


顺便说一句,我不服气

void *ptr = &dest;
*(int *)ptr

是合法的。该标准表示任何(对象)指针都可以转换为 void * 并返回而不会丢失信息,但在这里您要从 A 类型转换为 void * 类型 B (其中 A != B)。

具体来说:&dest 的类型是 int (*)[4](指向 4 个整数的数组的指针),而不是 int *。要解决此问题,请执行

void *ptr = dest;

相反。或者只是 int *ptr = dest;,那么你甚至不需要强制转换。

关于c - 在 memcpy 之后检查数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52647824/

相关文章:

c - 假设在 C 中使用 IEEE754 float 表示 float 是否安全?

在函数中复制结构体并在c中返回副本

c++ - 在 C++ 中使用 memcpy 将结构写入 char 数组

c++ - 无法使用 memcpy 写入内存,但可以使用 WriteProcessMemory

c - memcpy 失败但赋值不在字符指针上

c - 在 C 中使用指针循环遍历结构元素

用C编译: undefined reference to `memcpy'

c - 如何在c中使用sscanf在分号后分隔数字

close() 没有正确关闭套接字

c++ - 从偏移量开始复制到结构的开头