我正在编写一个内存分配器,我需要一种在一个内存块中存储一个整数的方法。这个整数将代表块的大小,因此我可以在给定起点的情况下导航到终点。

这是我的测试示例:

//编辑:声明了testInt的空间
int * testInt =新的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);

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

我想做的事有意义吗?

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

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

最佳答案

回答原始问题

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?一个整数*?一个整数?在后一种情况下,请使用&testInt。
从标签中还可以看到,您正在使用C++而不是C。但是您的代码实际上只是C,因此您应该真正使用更安全的C++函数和功能:
  • memset-> std::fill
  • memcpy-> std::copy
  • malloc->新的
  • printf-> cout或(更好)Boost::Format

  • 回答您的编辑int* testInt;是一个指向整数变量的指针,但尚未初始化:它将指向一个随机存储区(出于所有意图和目的,我们可以认为它是“随机的”,即使不是)。
    然后memcpy将尝试向您最可能无法访问的随机存储器区域进行写入,因此会导致分段错误(这意味着“您无法访问该存储器区域”)。

    关于c++ - MemSet和MemCpy,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2557804/

    10-11 15:33