memcpy错误:分段错误(堆芯转储)

memcpy错误:分段错误(堆芯转储),c,pointers,memcpy,C,Pointers,Memcpy,我试图使用memcpy将c中的一个字符串复制到另一个字符串,代码如下: #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct fullName { char* firstName; char* lastName; } NAME; int main() { NAME myName, hisName; m

我试图使用memcpy将c中的一个字符串复制到另一个字符串,代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


typedef struct fullName
{
    char* firstName;
    char* lastName;
} NAME;

int main()
{              
    NAME myName, hisName;

    myName.firstName =  "aaaaaaa";
    hisName.firstName = "bbbbbb";

    memcpy(myName.firstName, hisName.firstName, sizeof(hisName.firstName));

    printf("myName.firstName = %s\n", myName.firstName);
    printf("hisName.firstName = %s\n", hisName.firstName);
}
并给出了程序运行后的分段错误 我试图将firstName和lastName声明为指向字符数组的指针,而不是指向字符的指针,但错误仍然存在。我错过了什么?!plz帮助

仅供参考。。我在Ubuntu 14上工作,我在这些语句中使用gcc Ubuntu 4.8.2-19ubuntu1…

myName.firstName =  "aaaaaaa";
hisName.firstName = "bbbbbb";
您使用字符串文本的地址初始化了指针

在下一次发言中

memcpy(myName.firstName, hisName.firstName, sizeof(hisName.firstName));
您尝试修改其中一个字符串文本

根据C标准6.4.5字符串文本

7未说明这些数组是否不同,前提是它们的 元素具有适当的值。如果程序试图 如果修改这样的数组,则行为未定义

还有这个表达

sizeof(hisName.firstName)
返回指针本身的大小。它与相应字符串文字的大小不同

有效的程序可以如下所示

#include <stdio.h>
#include <string.h>


typedef struct fullName
{
    char firstName[8];
    char lastName[8];
} NAME;

int main()
{              
    NAME myName = { "aaaaaaa" };
    NAME hisName = { "bbbbbb" };

    memcpy( myName.firstName, hisName.firstName, sizeof( hisName.firstName ) );

    printf( "myName.firstName = %s\n", myName.firstName );
    printf( "hisName.firstName = %s\n", hisName.firstName );
}
在这些声明中

myName.firstName =  "aaaaaaa";
hisName.firstName = "bbbbbb";
您使用字符串文本的地址初始化了指针

在下一次发言中

memcpy(myName.firstName, hisName.firstName, sizeof(hisName.firstName));
您尝试修改其中一个字符串文本

根据C标准6.4.5字符串文本

7未说明这些数组是否不同,前提是它们的 元素具有适当的值。如果程序试图 如果修改这样的数组,则行为未定义

还有这个表达

sizeof(hisName.firstName)
返回指针本身的大小。它与相应字符串文字的大小不同

有效的程序可以如下所示

#include <stdio.h>
#include <string.h>


typedef struct fullName
{
    char firstName[8];
    char lastName[8];
} NAME;

int main()
{              
    NAME myName = { "aaaaaaa" };
    NAME hisName = { "bbbbbb" };

    memcpy( myName.firstName, hisName.firstName, sizeof( hisName.firstName ) );

    printf( "myName.firstName = %s\n", myName.firstName );
    printf( "hisName.firstName = %s\n", hisName.firstName );
}

这并没有在MSVC中崩溃,而是产生了以下输出:

myName.firstName = bbbbaaa
hisName.firstName = bbbbbb
请注意,只有他的名字中的4个字符被复制到myName。那是因为

sizeof(hisName.firstName)

在你的平台上是4,指针的大小。但无论如何,操纵这些字符串都是未定义的行为。

这在MSVC中没有崩溃,它生成了以下输出:

myName.firstName = bbbbaaa
hisName.firstName = bbbbbb
请注意,只有他的名字中的4个字符被复制到myName。那是因为

sizeof(hisName.firstName)
在你的平台上是4,指针的大小。但无论如何,操作这些字符串都是未定义的行为。

您正在为myName.firstName和hisName.firstName分配指向字符串文本的指针。无法修改字符串文字,这是导致错误的原因

为了实现您想要的,您可以将firstName声明为char数组,或者将内存分配为char指针

数组方法:

typedef struct fullName
{
        char firstName[256]; // a sufficiently large number
        char lastName[256];
} NAME;

int main()
{              
        NAME myName, hisName;
        strcpy(myName.firstName, "aaaaaaa"); // You can't assign a string directly
        strcpy(hisName.firstName, "bbbbbb");
        memcpy(myName.firstName, hisName.firstName, sizeof(hisName.firstName));
        printf("myName.firstName = %s\n", myName.firstName);
        printf("hisName.firstName = %s\n", hisName.firstName);

}
分配方法:

typedef struct fullName
{
        char* firstName;
        char* lastName;
} NAME;

int main()
{              
        NAME myName, hisName;
        size_t buffersize = 256; // a sufficiently large number
        myName.firstName = malloc(buffersize);
        hisName.firstName = malloc(buffersize); // same for lastName

        strcpy(myName.firstName, "aaaaaaa");
        strcpy(hisName.firstName, "bbbbbb");
        memcpy(myName.firstName, hisName.firstName, buffersize); // You can't use sizeof() as this will give the size of a pointer
        printf("myName.firstName = %s\n", myName.firstName);
        printf("hisName.firstName = %s\n", hisName.firstName);

}
您正在为myName.firstName和hisName.firstName分配指向字符串文本的指针。无法修改字符串文字,这是导致错误的原因

为了实现您想要的,您可以将firstName声明为char数组,或者将内存分配为char指针

数组方法:

typedef struct fullName
{
        char firstName[256]; // a sufficiently large number
        char lastName[256];
} NAME;

int main()
{              
        NAME myName, hisName;
        strcpy(myName.firstName, "aaaaaaa"); // You can't assign a string directly
        strcpy(hisName.firstName, "bbbbbb");
        memcpy(myName.firstName, hisName.firstName, sizeof(hisName.firstName));
        printf("myName.firstName = %s\n", myName.firstName);
        printf("hisName.firstName = %s\n", hisName.firstName);

}
分配方法:

typedef struct fullName
{
        char* firstName;
        char* lastName;
} NAME;

int main()
{              
        NAME myName, hisName;
        size_t buffersize = 256; // a sufficiently large number
        myName.firstName = malloc(buffersize);
        hisName.firstName = malloc(buffersize); // same for lastName

        strcpy(myName.firstName, "aaaaaaa");
        strcpy(hisName.firstName, "bbbbbb");
        memcpy(myName.firstName, hisName.firstName, buffersize); // You can't use sizeof() as this will give the size of a pointer
        printf("myName.firstName = %s\n", myName.firstName);
        printf("hisName.firstName = %s\n", hisName.firstName);

}

在memcpy之后,需要使用空字符终止myName.firstName。无法更改字符串文本。如果可能更改,则结果未定义。在memcpy之后,需要使用空字符终止myName.firstName。无法更改字符串文本。如果结果可能会发生变化,那么结果是未定义的。