Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XCODE中的EXC错误访问(代码=2,地址=0x100041038)_C_Xcode_Memory Management_Exc Bad Access - Fatal编程技术网

XCODE中的EXC错误访问(代码=2,地址=0x100041038)

XCODE中的EXC错误访问(代码=2,地址=0x100041038),c,xcode,memory-management,exc-bad-access,C,Xcode,Memory Management,Exc Bad Access,尝试从堆保留中手动分配内存。使用以下方法分配1MB堆空间: partition = *(partition_t*) malloc(1048576*sizeof(partition_t)); 其中“partition”是单个字符(1字节)的结构: 在代码的后面部分,包含分区元数据的struct meta_t使用以下方法放置在每个分区的前40个字节中: boolean start_memory(partition_t *partition_ptr, global_memory_info_t *gl

尝试从堆保留中手动分配内存。使用以下方法分配1MB堆空间:

partition = *(partition_t*) malloc(1048576*sizeof(partition_t));
其中“partition”是单个字符(1字节)的结构:

在代码的后面部分,包含分区元数据的struct meta_t使用以下方法放置在每个分区的前40个字节中:

boolean start_memory(partition_t *partition_ptr, global_memory_info_t *global_memory_info_ptr)
{
boolean initialized = False;
partition_meta_t meta;

if (partition_ptr != NULL)
{
    global_memory_info_ptr->memory_size = SIZE;
    global_memory_info_ptr->free_memory = SIZE;
    global_memory_info_ptr->used_memory = 0;
    global_memory_info_ptr->block_base_address = partition_ptr;

    meta.size = SIZE;
    meta.available = True;
    meta.start_address = partition_ptr;
    meta.used_memory = 0;
    meta.extra_memory = 0;
    meta.next_partition = NULL;
    meta.prev_partition = NULL;

    *((partition_meta_t *)partition_ptr) = meta;

    initialized = True;  
}   
return initialized;
}
元数据还充当一个链表,用于跟踪其他分区

用户会发出二进制倍数(2^n)的内存大小请求,并将分区重复减半,直到找到合适的块为止。在其他地方检查合适的尺寸。下面的函数将传递的分区减半,并将元数据附加到新分区的起始地址

void mem_chopper(partition_t *partition_ptr)
{
partition_meta_t meta;

int start_address_offset = ((partition_meta_t *)(partition_ptr))->size / 2 ;

meta.start_address = ((partition_meta_t *)(partition_ptr))->start_address + (((partition_meta_t *)(partition_ptr))->size / 2);
meta.available = True;
meta.size = start_address_offset;
meta.used_memory = 0;
meta.extra_memory = 0;
meta.next_partition = NULL;
meta.prev_partition = NULL;
((partition_meta_t *)(partition_ptr))->next_partition = meta.start_address;
((partition_meta_t *)(partition_ptr))->size = start_address_offset;

meta.prev_partition = ((partition_meta_t *)(partition_ptr))-> start_address;

*((partition_meta_t *)meta.start_address) = meta;

}
问题是:mem_chopper()函数将在第一次正常执行,并划分初始分区,然后将元数据放置在新分区中。但是,在再次划分分区的第二次过程中,我将获得一个EXC_BAD_访问(code=2,address=0x100041038)

地址0x100041038正好与原来1MB内存的1/4重合。当我分配2MB堆空间时,程序仍然在地址0x100041038处崩溃,现在是分配内存的1/8

为什么EXC\u访问错误(代码=2,地址=0x100041038)会崩溃

整个代码如下所示:


堆大小在mem_commands.h中由变量大小定义。

partition=*(partition_t*)malloc(1048576*sizeof(partition_t))是内存泄漏。@zenith-Oh?请删除。您丢失了malloc返回的指针,因此无法释放它。所以,稍后,当我释放(分区)时,这将不起作用?即使我已将分区的起始地址保存到其他位置?这是EXC\u坏访问的原因吗?这能解决它吗?partition_t*partition=(partition_t*)malloc(SIZE*sizeof(partition_t));
void mem_chopper(partition_t *partition_ptr)
{
partition_meta_t meta;

int start_address_offset = ((partition_meta_t *)(partition_ptr))->size / 2 ;

meta.start_address = ((partition_meta_t *)(partition_ptr))->start_address + (((partition_meta_t *)(partition_ptr))->size / 2);
meta.available = True;
meta.size = start_address_offset;
meta.used_memory = 0;
meta.extra_memory = 0;
meta.next_partition = NULL;
meta.prev_partition = NULL;
((partition_meta_t *)(partition_ptr))->next_partition = meta.start_address;
((partition_meta_t *)(partition_ptr))->size = start_address_offset;

meta.prev_partition = ((partition_meta_t *)(partition_ptr))-> start_address;

*((partition_meta_t *)meta.start_address) = meta;

}