c - 使用 memcpy() 将结构复制到另一个内存位置时遇到问题

标签 c struct

好吧,基本上我不确定这里发生了什么

我基本上试图将我定义的结构变量复制到我使用 memcopy 进行 malloc 的另一个内存位置

编译器没有给出任何错误和警告

但是,当我尝试访问 malloc 的内存位置以查看数据是否已复制时,当我取消引用指针而不是复制的值时,我发现出现了一些奇怪的数字

这是我的代码,我在这里到底缺少什么,

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <stdint.h>

typedef uint32_t u_int32_t;

typedef unsigned char byte;
typedef u_int32_t link;
typedef u_int32_t size;
typedef u_int32_t addr;

typedef struct header {
   u_int32_t unkno;  
   size sze;     
   link next;     
   link prev;     
} head;

int main(){

   head x;

   printf("%d %d %d %d\n", &x, &x.unkno,sizeof(head),0x12345);

   x.unkno = 0x12345;
   x.sze = 10;
   x.next = 2;
   x.prev = 6;

   void * s = malloc(sizeof(u_int32_t)*100);

   memcpy(s, (const void *)&x, sizeof(head));

   head * k = (head *)s;

   printf("%d",*(k+1));

   return 0;
}

那么,如果有人能指出我做错了什么,或者这是否可能?

最佳答案

您仅将一个结构复制到您分配的400字节中,并且malloc不会以任何方式初始化内存。

malloc 新分配的内存的内容不确定,从未初始化的内存中读取会导致未定义的行为

此外,当您执行*(k + 1)时,您将k视为数组,并访问第二个元素( >*(k + 1) 相当于 k[1])。然后,您可以执行一些更奇怪的操作,并将该值打印为十进制数,但事实并非如此。

最后,当使用 printf 打印指针时您应该使用 "%p" 格式说明符。

<小时/>

要真正回答您的问题,那么您复制的数据就在那里,位于分配的内存的开头。您只是不打印任何内容。

关于c - 使用 memcpy() 将结构复制到另一个内存位置时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32218236/

相关文章:

c++ - Boost Spirit Parser 使用三个字符串的 vector 编译成一个结构,适应不工作

c - 将数据存储在程序中而不是外部文件中

go - Golang 中的结构声明

c - 将指针从 c 中的函数传回 main

c - 在 C 中连接两个字符串的安全方法

c - 用于在 C 中连接两个字符串的宏

c - BGLIB SiliconLabs 代码错误?

c - 如何使用清除属性初始化变量?

c - 使用 sleep 函数时如何增加计数? (C语言)

c - 使用 memcpy 从缓冲区复制到结构数组时出现 SEGFAULT