C memset工作不正常

C memset工作不正常,c,linux,memcpy,libc,C,Linux,Memcpy,Libc,我有以下一组代码无法找到获取垃圾值的原因。我的目的是复制字节数作为目标,而不考虑源,以便为我的应用程序创建通用副本。但是没有得到正确的结果。有没有办法做到这一点 int main() { char x[6]; char *i="pra"; memset(&x,0,6); //Doing memset memcpy(&x,i,6); printf("%x %x %x %x %x %x",x[0],x[1],x[2],x[3],x[4],x[

我有以下一组代码无法找到获取垃圾值的原因。我的目的是复制字节数作为目标,而不考虑源,以便为我的应用程序创建通用副本。但是没有得到正确的结果。有没有办法做到这一点

int main()
{
    char x[6];
    char *i="pra";
    memset(&x,0,6); //Doing memset

    memcpy(&x,i,6);
    printf("%x %x %x %x %x %x",x[0],x[1],x[2],x[3],x[4],x[5]);
}

o/p:
70 72 61 0 25 78
我们可以看到0之后的输出是垃圾。但是它为什么提交以及在哪里提交。 乳清膜组工作不正常。
请帮助找出这个概念的原因。

您正在将六个字节从i复制到x,但在i中只有四个字节的非垃圾值,因此最后两个字节是在i之后发生的。您正在复制6个字节的i,而其长度是4。这样做可以解决问题:

memcopy(&x, i, strlen(i));
memset工作正常。但是memcpy可以处理垃圾数据到缓冲区

int main()
{
    char x[6];
    char *i="pra";
    memset(&x,0,6); //Doing memset
    printf("%x %x %x %x %x %x",x[0],x[1],x[2],x[3],x[4],x[5]); // All will be 0 here
    memcpy(&x,i,6); //6 bytes here mentioned is reponsible for that values
    printf("%x %x %x %x %x %x",x[0],x[1],x[2],x[3],x[4],x[5]);
}

来自何处的垃圾。无论源长度如何,我都需要实现一个通用副本。该长度应该是目标。@pradipta:这是不可能的。@pradipta,堆栈中的这些垃圾可能是。因为x[]是本地的。在这种情况下,如果x小于源,那么未定义的行为将是结果1,它是memcpy;2这将不必要地让我走两次,也不会让x终止。@MatteoItalia是对的。这正是strcpy和strncpy被发明的目的。你可以做一个MINstrleni+1,6,在那里可以找到min宏。谢谢Nicop,是的,我也这么认为。它将提供一种复制通用方式的方法。我的意思是。。什么这是文本还是哪一段。@pradipta:读取数组的末尾是未定义的行为,这就是您正在执行的操作。这是一个错误,你应该修复它。谢谢你,但是。。如果我使用源代码的长度,那么如果源代码小于该长度,也会导致错误。@pradipta:这就是为什么你必须知道源代码和目标代码的大小;不使用memset/memcpy来复制尽可能多的i,而不需要过多/过少地填充x,如果需要,可以使用0填充。