我有以下代码:
我的问题是,每当我调用此函数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编程书。您的工作时间还不够。
关于c - C |指针分段故障,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45151144/