【问题标题】:MemSet & MemCopyMemSet 和 MemCpy
【发布时间】: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 这是价值,我现在已经降低了它不会溢出

标签: c++ segmentation-fault memcpy memset


【解决方案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 分配内存。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-04-10
          • 1970-01-01
          • 2014-06-09
          • 1970-01-01
          • 2010-12-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多