memcpy错误:分段错误(核心转储)

时间:2015-04-08 19:28:50

标签: c pointers memcpy

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

#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);
}

并且在运行程序后出现Segmentation fault(core dumped)错误 我试图声明firstNamelastName作为指向char数组的指针,而不是指向char的指针,但错误仍然存​​在。我错过了什么?!请帮忙......

仅供参考。我正在使用Ubuntu 14而我正在使用gcc(Ubuntu 4.8.2-19ubuntu1)...

3 个答案:

答案 0 :(得分:5)

在这些陈述中

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 );
}

答案 1 :(得分:1)

您正在为myName.firstNamehisName.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);

}

答案 2 :(得分:0)

这在MSVC中没有崩溃,它产生了输出:

myName.firstName = bbbbaaa
hisName.firstName = bbbbbb

请注意,hisName中仅有4个字符已复制到myName。那是因为

sizeof(hisName.firstName)

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