我正在编写内存分配器,我需要一种方法来在一块内存中存储一个整数。这个整数将代表块的大小,所以我可以导航到指向开头的指针。
这是我的测试示例:
//编辑:为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);
这会在倒数第二行引发分段错误。
我想做的事情有意义吗?
如果是这样,那么正确的做法是什么?
非常感谢大家的帮助!!问题解决了: - )
答案 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 ++函数和功能:
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”,那么它可能是因为你按值传递了它,并且它没有被改变吗?