我真的很难理解为什么以下代码无效并导致段错误。
Car *newCar;
Car *oldCar;
newCar->engineSize = 1500;
memcpy(newCar, oldCar, sizeof(Car));
我显然遗漏了一些非常基本的东西,但不知道它是什么。任何帮助将不胜感激。
由于
答案 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)
您尚未分配任何内存,因此您的newCar
和oldCar
堆栈变量具有随机值,并指向某些可能未被进程映射的任意内存位置。
答案 4 :(得分:1)
如上所述,代码使用的是未初始化的指针。 newCar
和oldCar
都是可以具有任何值的指针,因此赋值和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));