这是否会在任何情况下导致崩溃 - 将 void 缓冲区复制到 unsigned char?

Is this can cause a crash at any situation - copying the void buffer to the unsigned char?

在我项目的一个地方,崩溃发生在 memcpy()。我分析了coredump,发现指针好像没问题。场景是 void 缓冲区是 src 而 char buf[8] 是目的地。将 void * 复制到 char * 是否会在任何情况下导致崩溃?

我已尝试在此处重现该代码段,但我在 PC 上没有遇到任何崩溃。

#include "stdio.h"

void  main()
{

 void *buff  = "Hero";

 unsigned char buffer[5];

 memcpy(buffer,buff,5);

 printf("The value of buffer is %s\r\n", buffer);

}

不会崩溃。它工作正常。但是你必须包括 header string.h.

您没有包含 string.h 并且忽略了 memcpy 尚未定义的警告。这意味着 args 将被视为 ints,如果 int 和指针在 machine/compiler 上的大小不同,则代码将崩溃。

有几个小问题:

  • void main() 应该是 int main()
  • 你需要在 main()
  • 末尾添加一个 return 0;
  • void * buffer 实际上应该是 const void * buffer 或更好 const char * buffer (因为它指向字符串文字)
  • #include "stdio.h" 应该是 #include <stdio.h>

还有一个潜在的主要问题:

  • 您需要添加 #include <string.h> - 省略这很可能会导致 ints 和指针大小不同的系统崩溃(例如 32 位 ints 和 64位指针)

请注意,您应该始终在启用警告的情况下进行编译(例如 gcc -Wall ...)——这样编译器将捕获上述简单错误。要求函数原型也是一个好主意——这样你的代码甚至无法编译,因为缺少 memset 的原型会导致编译错误。