首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >memcpy段错误

memcpy段错误
EN

Stack Overflow用户
提问于 2012-01-10 23:08:38
回答 6查看 8.9K关注 0票数 1

我真的很难理解为什么下面的代码不能工作并导致段错误。

代码语言:javascript
复制
Car *newCar;
Car *oldCar;
newCar->engineSize = 1500;
memcpy(newCar, oldCar, sizeof(Car)); 

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

谢谢

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-01-10 23:10:10

你需要为它分配内存。

代码语言:javascript
复制
Car* newCar = malloc(sizeof(Car));
Car* oldCar = malloc(sizeof(Car));
...
free(oldCar);
free(newCar);

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

代码语言:javascript
复制
Car newCar;
Car oldCar;
newCar.engineSize = 1500;
memcpy(&newCar, &oldCar, sizeof(newCar));
票数 3
EN

Stack Overflow用户

发布于 2012-01-10 23:14:08

变量定义,如

代码语言:javascript
复制
Car* newCar;

只给你一个指针变量。它所能做的就是保存一个叫做Car的东西的地址。Car的内存大小在这里是未知的,但它可以很容易地比仅仅是指针所需的大几千倍。

在更改实际值之前,您需要为其分配内存,例如,通过将字段分配给engineSize或调用memcpy()

代码语言:javascript
复制
newCar = malloc(sizeof *newCar);
memcpy(newCar, oldCar, sizeof *newCar);

请注意,假设这是一个可赋值的struct,通常不需要使用memcpy()

代码语言:javascript
复制
*newCar = *oldCar;

这样读起来更整洁,程序员出错的可能性也更小。

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

代码语言:javascript
复制
newCar = malloc(sizeof *newCar);
*newCar = *oldCar;
newCar->engineSize = 1500;
票数 3
EN

Stack Overflow用户

发布于 2012-01-10 23:09:45

在对newCar进行写操作之前,需要为它分配一些内存。

代码语言:javascript
复制
Car* newCar = malloc(sizeof(Car));

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8805452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档