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

using memcpy to copy arrays passed as parameters

我想将一些在函数中作为参数传递的字符数组的内容复制到另一个字符数组。所以我将这些数组作为指针传递(通过引用传递)。然后我使用 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时,复制操作成功:

声明

memcpy(target,source, strlen(source))

应该复制字符串的所有字符。但是,它会在复制标记字符串结尾的 0 字节之前停止。所以你复制的不会是一个字符串。如果您在新副本 (target) 上调用任何字符串函数,这将是一个问题,基本上如果您以任何方式使用 target,您将离开终点,因为终点现在没有标记。可能你会获取一些额外的字节,任何在 target 之后恰好在内存中的东西,最坏的情况是你编程 segfalts 如果它行进足够远而没有找到 0。函数 strcpy 将复制0字节,我一般用

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

因为它不会写入超过目标缓冲区的末尾,并且它总是为 0 腾出空间,以防止在下一个字符串操作中出现问题。