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

标签 c arrays pointers memcpy

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

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

最佳答案

声明

memcpy(target,source, strlen(source))

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

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

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

关于c - 使用 memcpy 复制作为参数传递的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30698580/

相关文章:

c - Windows PE 结构中的管理进程位

c++ - 传递指针后数组数据被破坏,C

c++ - 使用 C 字符串和指针。删除除小写字母和空格之外的所有字符

c - 如何将 char[ ] 转换为 char * ?

c - Point Grey firefly MV、dc1394 和 USB 3.0

c - 我的二进制文件中的这些额外字节是什么?

c++ - 关于内联性能的问题

php - 如何将多个SQL查询合并为1个并将其输出为PHP数组

python - 向量化在 ndarray 的子数组上操作的函数

javascript - 无法从日期对象javascript获取日期和月份