首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MemSet & MemCopy

MemSet & MemCopy
EN

Stack Overflow用户
提问于 2010-04-01 02:37:45
回答 5查看 1.7K关注 0票数 1

我正在编写一个内存分配器,我需要一种方法在内存块中存储一个整数。这个整数将表示块的大小,因此我可以在指针指向开头的情况下导航到末尾。

下面是我的测试示例:

//编辑: testInt int* testInt =新int的声明空间;

代码语言:javascript
运行
复制
head_ptr = (char*) malloc(4*1024*1024); // Allocate 4MB

// EDIT: Should have used std::fill and std::copy
memset(head_ptr,23,sizeof(int)); // Set Address head_ptr = 12345

memcpy(testInt,head_ptr,sizeof(int)); // Set testInt = head_ptr

printf("testInt = %i",testInt);

这会在第二行到最后一行引发分段错误。

我想做的事有意义吗?

如果是的话,正确的做法是什么?

非常感谢大家的帮助!问题解决:-)

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-04-01 02:40:25

对原问题的回答

代码语言:javascript
运行
复制
memset(head_ptr,12345,sizeof(int)); // Set Address head_ptr = 12345

不,没有。这将head_ptr的第一个head_ptr字节设置为12345,这将溢出(除非您使用的是一个字节大于8位的体系结构)。

代码语言:javascript
运行
复制
memcpy(testInt,head_ptr,sizeof(int)); // Set testInt = head_ptr

testInt是什么?一个int*?一个int?在后一种情况下,Use&testInt。

此外,从标记中可以看出,您使用的是C++而不是C。但是您的代码实际上是C,您应该使用更安全的C++函数和特性:

  • memset -> std::fill
  • memcpy -> std::复制
  • malloc ->新
  • 打印-> cout或(更好) 促进::格式

回答您的编辑

int* testInt;是一个指向整数变量的指针,但它没有初始化:它将指向一个随机内存区域(我们可以考虑它的所有意图和目的,即使它不是随机的)。

然后,memcpy将尝试写入最有可能无法访问的随机内存区域,从而导致分段错误(这意味着“您无法访问此内存区域”)。

票数 5
EN

Stack Overflow用户

发布于 2010-04-01 02:42:31

您从未初始化过testInt,所以您的memcpy调用是写给谁知道在哪里的。

试试这个:

int *testInt = malloc(sizeof(int));

票数 2
EN

Stack Overflow用户

发布于 2010-04-01 02:55:20

其他人则评论了memset(3)memcpy(3)的不当使用,因此我将回答分配器问题。

如果您真的在C++中构建自定义内存分配器,那么请看一下Alexandrescu的现代C++设计中的第4章。它将向您详细介绍实现小对象分配器的过程。该代码可作为洛基图书馆的一部分使用。

伙计,有人喜欢独角兽.)

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

https://stackoverflow.com/questions/2557804

复制
相关文章

相似问题

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