使用memcpy复制作为参数传递的数组

时间:2015-06-07 21:24:00

标签: c arrays pointers memcpy

我想将函数中作为参数传递的一些char数组的内容复制到另一个char-arrays。所以我将这些数组作为指针传递(通过引用传递)。然后我使用memcpy将这些数组的内容复制到其他一些数组中。但复制过程并不太准确,尽管我认为我正确地使用了memcpy。一些角色被删除,而一些新的角色出现了。我尝试使用strcpy,因此正确复制了这些数组的内容。所以我想了解为什么在使用memcpy时复制过程失败了。这是我的一些代码:

struct student{
    bool statusFlag;
    char lastname[20];
    char firstname[20];
    int  mNr;
 };

这是方法:

 struct student getData(char * lastname, char * firstname, int matNr){
     struct student st;
    int i;
    printf("%s\n",lastname);
    if(insertCounter<=size){
        //get data
        st.statusFlag=1;
        memcpy(st.lastname,lastname,strlen(lastname));
        memcpy(st.firstname,firstname,strlen(firstname));
        st.mNr=matNr;
        printf("%s,%s,%d\n",st.lastname,st.firstname,st.mNr);
        return st;
    }else if(insertCounter>size){
       st.statusFlag=0;
        return st;
}    

当我用strcpy替换memcpy时,复制操作成功:

1 个答案:

答案 0 :(得分:0)

声明

memcpy(target,source, strlen(source))

应该复制字符串的所有字符。但是,它将停止复制标记字符串结尾的0字节。所以你复制的不是字符串。如果您在新副本(目标)上调用任何字符串函数,这将是一个问题,如果您以任何方式使用目标,基本上,您将走到最后,因为结束现在没有标记。可能你会选择一些额外的字节,在 target 之后发生在内存中的任何事情,最坏的情况是你编程segfalts如果它行进得足够远而没有找到0.函数strcpy将复制0字节,我通常使用

snprintf(target, sizeof target,  "%s", source); 

因为它没有写入目标缓冲区的末尾,并且它总是为0提供空间,所以在下一个字符串op中防止出现问题。