C 这是否会在任何情况下导致崩溃-将空缓冲区复制到未签名字符?

C 这是否会在任何情况下导致崩溃-将空缓冲区复制到未签名字符?,c,linux,C,Linux,在我项目的一个地方,崩溃发生在memcpy。我分析了coredump,发现指针似乎没有问题。这种情况下,void缓冲区是src,char buf[8]是目标。将void*复制到char*会在任何情况下导致崩溃吗 我试图在这里复制这个片段,但是我的电脑没有崩溃 #include "stdio.h" void main() { void *buff = "Hero"; unsigned char buffer[5]; memcpy(buffer,buff,5); printf(

在我项目的一个地方,崩溃发生在memcpy。我分析了coredump,发现指针似乎没有问题。这种情况下,void缓冲区是src,char buf[8]是目标。将void*复制到char*会在任何情况下导致崩溃吗

我试图在这里复制这个片段,但是我的电脑没有崩溃

#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);

}

它不会崩溃。它工作得很好。但是您必须包含头字符串.h.

您没有包含字符串.h,并且忽略了memcpy尚未定义的警告。这意味着参数将被视为int,如果计算机/编译器上的int和指针大小不同,则代码将崩溃。

存在一些小问题:

void main应该是int main 您需要返回0;在主菜单的末尾 void*buffer实际上应该是const void*buffer,或者更好的是const char*buffer,因为它指向字符串文本 include stdio.h应为include 还有一个潜在的主要问题:

您需要添加include-忽略这一点可能会导致Int和指针大小不同(例如32位Int和64位指针)的系统崩溃
请注意,编译时应始终启用警告,例如gcc-Wall…-这样,编译器将捕捉到上面这样的简单错误。要求函数原型也是一个好主意-这样您的代码甚至无法编译,因为memset缺少原型会导致编译错误。

您确定buff大小始终正确吗?试着将Hero简化为He并保持代码原样,这个问题不是关于大小,而是关于将void*复制到unsigned char*。对我来说很明显,尺寸需要改变。如果我可以投票两次…,你会这样吗?您编译程序时是否没有警告?@PaulR void*缓冲区的原因是否声明为常量?@felipeek:answer updated-它指向一个不可修改的字符串文本。@felipeek声明void*指针常量是错误的原因?@iharob无原因。我只是好奇它不应该是const char*buffer吗?