MemSet 和 MemCpy
Posted
技术标签:
【中文标题】MemSet 和 MemCpy【英文标题】:MemSet & MemCopy 【发布时间】:2010-04-01 02:37:45 【问题描述】:我正在编写一个内存分配器,我需要一种将整数存储在一块内存中的方法。这个整数将表示块的大小,因此我可以在给出指向开头的指针的情况下导航到末尾。
这是我的测试示例:
// 编辑:为 testInt 声明空间 int* testInt = new int;
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);
这会在倒数第二行引发分段错误。
我正在尝试做的事情有意义吗?
如果是这样,正确的做法是什么?
非常感谢大家的帮助!!问题解决了:-)
【问题讨论】:
testInt 是在哪里定义的?这似乎是这里的错误,与 head_ptr 无关。 因为 testInt 确实指向任何可靠的地方,所以 memcpy() 不起作用。你需要打印 *testInt - 你需要初始化它:int i; int *testInt = &i;
.
12345是值还是指向值的指针??
@Jonathin 你说得很好,但我仍然收到 Seg 错误
@jpyllman 这是价值,我现在已经降低了它不会溢出
【参考方案1】:
回答原问题
memset(head_ptr,12345,sizeof(int)); // Set Address head_ptr = 12345
不,它没有。这会将head_ptr
的第一个sizeof(int)
字节设置为12345,这将溢出(除非您使用的架构中一个字节超过8 位)。
memcpy(testInt,head_ptr,sizeof(int)); // Set testInt = head_ptr
什么是testInt?一个整数*?一个整数?在后一种情况下使用 &testInt。
从您的标签中也可以看出您使用的是 C++ 而不是 C。但是您的代码实际上只是 C,您应该真正使用更安全的 C++ 函数和特性:
memset -> std::fill memcpy -> std::copy malloc -> 新的 printf -> cout 或(更好)Boost::Format回答您的编辑
int* testInt;
是一个指向整数变量的指针,但它没有被初始化:它将指向一个随机内存区域(即使不是,我们也可以将其视为“随机”的所有意图和目的)。
memcpy
然后会尝试写入这个你很可能无权访问的随机内存区域,因此这会导致分段错误(这意味着“你无法访问这个内存区域”) .
【讨论】:
谢谢安德烈亚斯,非常感谢。【参考方案2】:其他人评论memset(3)
和memcpy(3)
的使用不当,所以我会回复分配器问题。
如果您真的从事在 C++ 中构建自定义内存分配器的业务 - 请查看 Alexandrescu 的Modern C++ Design 中的第 4 章。它会详细引导您实现小对象分配器。该代码作为Loki Library 的一部分提供。
伙计,有人喜欢独角兽... :)
【讨论】:
【参考方案3】:您从未初始化过 testInt,因此您的 memcpy 调用正在写入谁知道在哪里。
试试这个:
int *testInt = malloc(sizeof(int));
【讨论】:
【参考方案4】:如果 testInt 只是一个“int”,可能是因为您是按值传递它,并且它没有改变吗?
【讨论】:
【参考方案5】:无法确定testInt
是什么,但我的心理调试能力表明您需要将testInt
的地址而不是testInt
本身作为@987654324 的参数@。
编辑:看到您现在发布的内容后,您需要在使用之前为testInt
分配内存。
【讨论】:
以上是关于MemSet 和 MemCpy的主要内容,如果未能解决你的问题,请参考以下文章