MemSet和;的memcpy

时间:2010-04-01 02:37:45

标签: c++ segmentation-fault memcpy memset

我正在编写内存分配器,我需要一种方法来在一块内存中存储一​​个整数。这个整数将代表块的大小,所以我可以导航到指向开头的指针。

这是我的测试示例:

//编辑:为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);

这会在倒数第二行引发分段错误。

我想做的事情有意义吗?

如果是这样,那么正确的做法是什么?

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

5 个答案:

答案 0 :(得分:5)

回答原始问题

memset(head_ptr,12345,sizeof(int)); // Set Address head_ptr = 12345

不,不。这会将sizeof(int)的第一个head_ptr字节设置为12345,这将溢出(除非您使用的是一个字节超过8位的架构)。

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

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

从你的标签看,你使用的是C ++而不是C.但是你的代码实际上只是C,你应该真正使用更安全的C ++函数和功能:

  • memset - >的std ::填
  • memcpy - >的std ::复制
  • malloc - >新
  • printf - > cout或(更好)Boost::Format

回答你的编辑

int* testInt;是一个指向整数变量的指针,但它没有被初始化:它将指向一个随机存储区域(我们可以将其视为“随机”用于所有意图和目的,即使它不是)。 / p>

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

答案 1 :(得分:2)

你从来没有初始化过testInt,所以你的memcpy电话写给谁知道在哪里。

试试这个:

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

答案 2 :(得分:2)

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

如果你真的在C ++中构建自定义内存分配器 - 请看看Alexandrescu的Modern C++ Design中的第4章。它将引导您详细了解小对象分配器。该代码作为Loki Library

的一部分提供

男人,有人喜欢独角兽......:)

答案 3 :(得分:1)

无法看到testInt是什么我无法确定,但我的通灵调试能力表明你需要取testInt而不是testInt本身的地址作为memcpy的参数。

编辑:看到您现在发布的内容后,您需要在使用之前为testInt分配内存。

答案 4 :(得分:1)

如果testInt只是一个“int”,那么它可能是因为你按值传递了它,并且它没有被改变吗?