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的主要内容,如果未能解决你的问题,请参考以下文章

memset这个函数的详细,要求有相应的示例代码和说明

memset使用技巧

malloc、memset 和免费的正确用法

C++ memset 是不是仅适用于 0 和 -1? [关闭]

使用 D 切片的 memset() 和 memcpy()

struct 0 和 memset 0 有啥区别 [重复]