【问题标题】:memcpy uint32_t and char* into char*memcpy uint32_t 和 char* 转换为 char*
【发布时间】:2012-05-25 04:33:00
【问题描述】:

这对我不起作用:

char buff[11];
char* msg_ptr;
msg_ptr = buff;
uint8_t id; 
uint32_t msg_length;
char msg[] = "hallo";
id = 77;
msg_length = 5;

memcpy(buff, &id, sizeof(uint8_t));
memcpy(buff+1, &msg_length, sizeof(uint32_t));
strcpy(buff+5, msg);


printf("id :%d\n",*(uint8_t*)msg_ptr);
msg_ptr++;

printf("msg_length: %d\n", *msg_ptr);

msg_ptr++;
printf("msg: %s\n", msg_ptr);

Id 和 msg_lentgh 显示在 konsole 上,但之后出现分段错误。 我是C新手,请尽可能详细。 问候

【问题讨论】:

  • 这不是您的实际代码(首先,您有msg_ptrmsg_prt)。请发布您的实际代码。
  • 你还有错别字。
  • 嗨,错别字不是问题,它们很容易清除。我想知道我的思维错误。我是 stackoverflow 的新手,在左上角我注意到有人评论说我的缓冲区太小。但不应该是:id(1 byte) + msg_length(4 byte) + msg(5 byte) = 10 byte。
  • @user1324258:错字的问题。如果您没有显示您的实际代码,那么我们无法确定我们在回答时是否解决了实际问题。

标签: c char buffer memcpy


【解决方案1】:
msg_ptr = msg+1

那是你的问题。您应该执行 *msg_ptr++* 以转到下一个位置(即 *msg_len*)。相反,您将指针更改为指向 msg 字符串中的“a”。

代码中还有 2 个错误:

  • 您没有考虑字符串的终止符 '\0'。你有 1 + 4 + 5 + 1,最后一个是终止的 '\0'。此外,在处理字符串时使用 strncpy,它处理复制字符串终止符。 memcpy 将完全按照您的要求进行复制。你正在破坏你的堆栈。

  • 在最后一行,您必须将字符串打印为数字。使用 %s。

下面是 Wikipedia 对 C 字符串和 stack overflows 的评价。

【讨论】:

  • 您好,感谢您的详细回复。我更新了我的代码。现在分段错误消失了,但 msg 为空。
  • 您没有正确更新最后一个 msg_ptr。它应该是 msg_ptr += sizeof(uint32_t)(又名 4)。
  • 当我这样做时,我再次遇到分段错误。
  • buff 没有正确的大小并且您没有正确打印字符串(提示:取消引用字符串指针)
  • Okey size of buff 应该是 11。我确实取消了对字符串指针的引用。你能告诉我到底出了什么问题吗?
猜你喜欢
  • 2018-04-30
  • 1970-01-01
  • 1970-01-01
  • 2020-11-10
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
  • 2010-10-12
  • 2017-08-14
相关资源
最近更新 更多