首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用memcpy复制作为参数传递的数组

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

Stack Overflow用户
提问于 2015-06-07 21:24:00
回答 1查看 2.2K关注 0票数 2

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

代码语言:javascript
运行
复制
struct student{
    bool statusFlag;
    char lastname[20];
    char firstname[20];
    int  mNr;
 };

以下是一种方法:

代码语言:javascript
运行
复制
 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时,复制操作是成功的:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-08 01:10:58

声明

代码语言:javascript
运行
复制
memcpy(target,source, strlen(source))

应该复制字符串的所有字符。但是,它将停止复制标记字符串结束的0字节。所以你复制的不会是字符串。如果您调用新拷贝(目标)上的任何字符串函数,这将是一个问题,如果以任何方式使用target,则会从末尾前进,因为结束现在是未标记的。可能你会捡到一些额外的字节,任何碰巧在内存中的东西,如果你的程序在没有找到0的情况下走得够远的话,最坏的情况是你编写的片段会出错。函数strcpy将复制0字节,我通常使用

代码语言:javascript
运行
复制
snprintf(target, sizeof target,  "%s", source); 

因为它没有写过目标缓冲区的末尾,而且它总是为0腾出空间,防止下一个字符串op中出现故障。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30698580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档