这是否会在任何情况下导致崩溃 - 将 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 将被视为 int
s,如果 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>
- 省略这很可能会导致 int
s 和指针大小不同的系统崩溃(例如 32 位 int
s 和 64位指针)
请注意,您应该始终在启用警告的情况下进行编译(例如 gcc -Wall ...
)——这样编译器将捕获上述简单错误。要求函数原型也是一个好主意——这样你的代码甚至无法编译,因为缺少 memset
的原型会导致编译错误。
在我项目的一个地方,崩溃发生在 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 将被视为 int
s,如果 int
和指针在 machine/compiler 上的大小不同,则代码将崩溃。
有几个小问题:
void main()
应该是int main()
- 你需要在
main()
末尾添加一个 void * buffer
实际上应该是const void * buffer
或更好const char * buffer
(因为它指向字符串文字)#include "stdio.h"
应该是#include <stdio.h>
return 0;
还有一个潜在的主要问题:
- 您需要添加
#include <string.h>
- 省略这很可能会导致int
s 和指针大小不同的系统崩溃(例如 32 位int
s 和 64位指针)
请注意,您应该始终在启用警告的情况下进行编译(例如 gcc -Wall ...
)——这样编译器将捕获上述简单错误。要求函数原型也是一个好主意——这样你的代码甚至无法编译,因为缺少 memset
的原型会导致编译错误。