我尝试使用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)错误
我试图声明firstName
和lastName
作为指向char数组的指针,而不是指向char的指针,但错误仍然存在。我错过了什么?!请帮忙......
仅供参考。我正在使用Ubuntu 14而我正在使用gcc(Ubuntu 4.8.2-19ubuntu1)...
答案 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.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);
}
答案 2 :(得分:0)
这在MSVC中没有崩溃,它产生了输出:
myName.firstName = bbbbaaa
hisName.firstName = bbbbbb
请注意,hisName
中仅有4个字符已复制到myName
。那是因为
sizeof(hisName.firstName)
在您的平台上是4,指针的大小。但是,无论如何,操纵这些字符串都是未定义的行为。