我有这样的代码:C |指针|分割故障
我的问题是,每当我调用这个函数ma_init();
我得到一个分段错误上footer->status = FREE
;我会很感激,如果有人指出我在这里正确的方向,因为一些谷歌搜索几个小时后,我似乎无法弄清楚这一点。
编辑:头文件:
我有这样的代码:C |指针|分割故障
我的问题是,每当我调用这个函数ma_init();
我得到一个分段错误上footer->status = FREE
;我会很感激,如果有人指出我在这里正确的方向,因为一些谷歌搜索几个小时后,我似乎无法弄清楚这一点。
编辑:头文件:
的typedef无符号字符字节;
这是不可读的。考虑包括<stdint.h>
和使用uint8_t
。
我的问题是,每当我调用这个函数ma_init();我在footer-> status = FREE中得到了分段错误;
请学会与所有警告编译&调试信息(例如gcc -Wall -Wextra -g
与GCC ...),那么使用调试器(gdb
)...
要初始化header
到mem_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
,footer
,mem_pool
的值)。还可以考虑使用valgrind
顺便说一句,如果你正在编写一个memory allocator点菜malloc
你会更好地将它基于操作系统的特定原语(一般system calls)修改您的virtual address space。在Linux上,您可以使用mmap(2)和朋友。
点我到正确的方向上的一些谷歌上搜索后,这里会导致几个小时
你需要花周阅读一些优秀的C编程的书。您的工作时间不够。
你真的需要投入更多的时间,特别是学习使用调试器。 –
你的'尺寸大小;'不能保留acutal尺寸,因为它的数量太大了。 – mch
'mem_chunk_header :: size'的类型是什么?不应该是'size_t'? – dhke
@dhke我刚才在问题中调整了它。我忘了在这个问题中加入这个。抱歉。 'size size'是'int'类型。 – Bobby