memcpy segfault

时间:2012-01-10 15:08:38

标签: c

我真的很难理解为什么以下代码无效并导致段错误。

Car *newCar;
Car *oldCar;
newCar->engineSize = 1500;
memcpy(newCar, oldCar, sizeof(Car)); 

我显然遗漏了一些非常基本的东西,但不知道它是什么。任何帮助将不胜感激。

由于

6 个答案:

答案 0 :(得分:3)

你需要为它分配内存。

Car* newCar = malloc(sizeof(Car));
Car* oldCar = malloc(sizeof(Car));
...
free(oldCar);
free(newCar);

如果您不需要在其他地方使用指针,则可以使用堆栈分配。

Car newCar;
Car oldCar;
newCar.engineSize = 1500;
memcpy(&newCar, &oldCar, sizeof(newCar));

答案 1 :(得分:3)

变量定义,例如

Car* newCar;

只为您提供指针变量。它所能做的就是保持一个叫Car的东西的地址。 Car的内存大小在这里是未知的,但它可以轻松地比仅仅指针所需的数千倍大。

您需要在更改之前为实际值分配内存,方法是通过字段分配到例如engineSize或致电memcpy()

newCar = malloc(sizeof *newCar);
memcpy(newCar, oldCar, sizeof *newCar);

请注意,通常不需要使用memcpy(),假设这是struct,它们是可分配的:

*newCar = *oldCar;

这样可以更清晰,并且编程错误的可能性更小。

另请注意,复制完成后必须设置engineSize,否则复制时会被覆盖:

newCar = malloc(sizeof *newCar);
*newCar = *oldCar;
newCar->engineSize = 1500;

答案 2 :(得分:1)

newCar需要先分配一些内存才能写入内存。

Car* newCar = malloc(sizeof(Car));

现在你所拥有的只是一个指向内存中某个随机地址的指针,你试图写入该地址,这会导致未定义行为和seg错误。

答案 3 :(得分:1)

您尚未分配任何内存,因此您的newCaroldCar堆栈变量具有随机值,并指向某些可能未被进程映射的任意内存位置。

答案 4 :(得分:1)

如上所述,代码使用的是未初始化的指针。 newCaroldCar都是可以具有任何值的指针,因此赋值和memcpy会导致尝试写入它们碰巧指向的任何地址。实际上,编译器应该警告使用未初始化的变量;确保您已启用警告。

另一种方法是在堆栈上分配:

Car newCar;
Car oldCar;
newCar.engineSize = 1500;
memcpy(&newCar, &oldCar, sizeof(Car)); 

或malloc记忆:

Car *newCar = malloc( sizeof(Car));
Car *oldCar = malloc( sizeof(Car));
newCar->engineSize = 1500;
memcpy(newCar, oldCar, sizeof(Car)); 

答案 5 :(得分:1)

您需要为Car个实例分配空间。尝试

Car *newCar = (Car *)malloc(sizeof(Car);
Car *oldCar = (Car *)malloc(sizeof(Car);;
newCar->engineSize = 1500;
memcpy(newCar, oldCar, sizeof(Car));