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

Moh*_*ouf 1 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);
}
Run Code Online (Sandbox Code Playgroud)

并且它给出了分段错误(核心转储)运行程序之后的错误我试图声明firstNamelastName作为指向char数组的指针而不是指向char的指针,但错误仍然存​​在.我错过了什么?!请帮忙......

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

Vla*_*cow 5

在这些陈述中

myName.firstName =  "aaaaaaa";
hisName.firstName = "bbbbbb";
Run Code Online (Sandbox Code Playgroud)

你用字符串文字的地址初始化指针.

在下一个声明中

memcpy(myName.firstName, hisName.firstName, sizeof(hisName.firstName));
Run Code Online (Sandbox Code Playgroud)

您尝试修改其中一个字符串文字.

根据C标准(6.4.5字符串文字)

7如果这些数组的元素具有适当的值,则这些数组是否不同是未指定的.如果程序试图修改此类数组,则行为未定义.

也是这个表达

sizeof(hisName.firstName)
Run Code Online (Sandbox Code Playgroud)

返回指针本身的大小.它与相应字符串文字的大小不同.

有效的程序可能看起来如下

#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 );
}
Run Code Online (Sandbox Code Playgroud)