Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用memcpy复制作为参数传递的数组_C_Arrays_Pointers_Memcpy - Fatal编程技术网

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

使用memcpy复制作为参数传递的数组,c,arrays,pointers,memcpy,C,Arrays,Pointers,Memcpy,我想将函数中作为参数传递的一些字符数组的内容复制到另一个字符数组。所以我将这些数组作为指针传递(通过引用传递)。然后我使用memcpy将这些数组的内容复制到其他数组中。虽然我认为我正确地使用了memcpy,但复制过程并不太精确。删除了一些字符,同时出现了一些新字符。然后我尝试使用strcpy,因此这些数组的内容被正确复制。所以我想了解为什么在使用memcpy时复制过程失败。以下是我的一些代码: struct student{ bool statusFlag; char lastn

我想将函数中作为参数传递的一些字符数组的内容复制到另一个字符数组。所以我将这些数组作为指针传递(通过引用传递)。然后我使用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;
}    
struct student getData(char*lastname,char*firstname,int matNr){
结构学生;
int i;
printf(“%s\n”,lastname);
如果(insertCountersize){
st.statusFlag=0;
返回st;
}    
当我用strcpy替换memcpy时,复制操作成功了:

语句

memcpy(target,source, strlen(source))
应该复制字符串的所有字符。但是,它将停止复制标记字符串结尾的0字节。因此,您复制的不是字符串。如果在新副本(目标)上调用任何字符串函数,这将是一个问题,基本上如果您以任何方式使用target,您将离开末端,因为末端现在没有标记。可能您将拾取一些额外的字节,目标之后内存中的任何内容,最坏的情况是,如果Segfolts走得足够远而没有找到0,您将对其进行编程。strcpy函数将复制我通常使用的0字节

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

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

您没有复制终止的空字符。
strlen(…)+ 1 应该做这个技巧,虽然 StrcPy < /C>应该在复制时自动检查空字符,但它是哪种语言?它至少可以是C或C++,但是在这两种语言中,除了你所问的以外,你的代码至少有一个严重的问题,但是通常的方法是这样。lve这个问题取决于语言。它是纯c语言。是的,它现在正在工作。谢谢。如果你看到一些错误。你可以告诉我关于
snprintf的情况。它被认为更安全(而且在很多方面)。但是它容易产生以非空结尾的字符串(这本身就是一个安全问题)。因此,必须检查
snprintf
的返回值,并执行错误恢复或手动缓冲区空终止。@alan au我的经验和
snprintf
s手册页表明,snprintf不容易产生非空终止字符串。从(OSX)手册页:snprintf()和vsnprintf()函数将最多写入输出字符串中的n-1个字符(第n个字符将获得终止的“\0”);如果返回值大于或等于n参数,则字符串太短,部分打印字符被丢弃。输出总是以null结尾。