MemSet和MemCopy

pws*_*068 1 c++ memset memcpy segmentation-fault

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

这是我的测试示例:

//编辑: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);
Run Code Online (Sandbox Code Playgroud)

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

我想做的事情有意义吗?

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

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

Tho*_*ini 5

回答原始问题

memset(head_ptr,12345,sizeof(int)); // Set Address head_ptr = 12345
Run Code Online (Sandbox Code Playgroud)

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

memcpy(testInt,head_ptr,sizeof(int)); // Set testInt = head_ptr
Run Code Online (Sandbox Code Playgroud)

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

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

  • memset - > std :: fill
  • memcpy - > std :: copy
  • malloc - >新的
  • printf - > cout或(更好)Boost :: Format

回答你的编辑

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

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