2017-07-17 149 views
-2

我有这样的代码:C |指针|分割故障

我的问题是,每当我调用这个函数ma_init();我得到一个分段错误上footer->status = FREE;我会很感激,如果有人指出我在这里正确的方向,因为一些谷歌搜索几个小时后,我似乎无法弄清楚这一点。

编辑:头文件:

+0

你的'尺寸大小;'不能保留acutal尺寸,因为它的数量太大了。 – mch

+0

'mem_chunk_header :: size'的类型是什么?不应该是'size_t'? – dhke

+0

@dhke我刚才在问题中调整了它。我忘了在这个问题中加入这个。抱歉。 'size size'是'int'类型。 – Bobby

回答

1

的typedef无符号字符字节;

这是不可读的。考虑包括<stdint.h>和使用uint8_t

我的问题是,每当我调用这个函数ma_init();我在footer-> status = FREE中得到了分段错误;

请学会与所有警告编译&调试信息(例如gcc -Wall -Wextra -gGCC ...),那么使用调试器gdb)...

要初始化headermem_pool地址。

然后你做一些可疑(即错误pointer arithmetic

mem_chunk_header * footer = header + header->size + sizeof(mem_chunk_header); 
// the + above are likely to be wrong 

你加入的指针header所以+是尖的元件尺寸方面(不是字节),即在sizeof(mem_chunk_header)的单位当然是至少2和可能更多(在我的Linux/x86-64桌面上它是8)。你的footer很远。

使用调试器,您会注意到(通过查询header,footermem_pool的值)。还可以考虑使用valgrind

顺便说一句,如果你正在编写一个memory allocator点菜malloc你会更好地将它基于操作系统的特定原语(一般system calls)修改您的virtual address space。在Linux上,您可以使用mmap(2)和朋友。

点我到正确的方向上的一些谷歌上搜索后,这里会导致几个小时

你需要花阅读一些优秀的C编程的书。您的工作时间不够。

+0

你真的需要投入更多的时间,特别是学习使用调试器。 –