我有以下代码:

我的问题是,每当我调用此函数ma_init();时,都会在footer->status = FREE上遇到分段错误;如果有人在经过几个小时的谷歌搜索之后将我指向正确的方向,我将不胜感激,我似乎无法弄清楚。

编辑:头文件:

最佳答案

typedef无符号字符字节;


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


  我的问题是,每当我调用此函数ma_init();我在footer-> status = FREE上遇到了细分错误;


请学习使用所有警告和调试信息进行编译(例如gcc -Wall -Wextra -gGCC ...),然后使用调试器(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很远。

使用调试器,您会注意到这一点(通过查询headerfootermem_pool的值)。考虑也使用valgrind

顺便说一句,如果您要编码memory allocatoràmalloc,则最好将其基于特定于操作系统的原语(通常为system calls)来修改您的virtual address space。在Linux上,您将使用mmap(2)和好友。


  在经过几个小时的谷歌搜索后将我指向正确的方向


您需要花几周时间阅读一些不错的C编程书。您的工作时间还不够。

关于c - C |指针分段故障,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45151144/

10-12 16:12