写一个for循环中断程序(没想到)

Write in a for-loop breaking program (unexpectedly)

我正在尝试使用 POSIX 打开、写入、关闭具有早期定义块大小 (io_block) 的函数将已分配内存的值写入文件。所以当我做这样的事情时

#define memory_size (310*1024*1024)
#define start_address (void*) 0x190573A0
#define file_size (147*1024*1024)
#define io_block 138

int* ptr = mmap(start_address, memory_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, 0, 0);
int* thread_ptr_start = ptr;
int* thread_ptr_end = ptr + file_size;
int* loop_address;
for (loop_address = thread_ptr_start; loop_address < thread_ptr_end; loop_address += io_block) {
    write(output_file, loop_address, io_block);
}

我没有得到正常的结果,因为有些内存无法读取(BAD ACCESS), 但是当我这样做时(删除周期)

write(output_file, thread_ptr_start, thread_ptr_end - thread_ptr_start);

在调试时我看到,BAD ACCESS 发生在范围的中间 [thread_ptr_start, thread_ptr_end) 一切都正常了。

如何让第一个示例正常工作?

指针是“int *”。因此,当您(在循环中)递增它们时,它们会递增 sizeof(int) (而不是 1 个字节!)。在循环的每次迭代中,loop_address = loop_address + (io_block * sizeof(int))。这可以解释为什么你可能在记忆区走得太远。

此外,对 write(...io_block) 的调用仅写入 io_block 字节(而不是 io_block * sizeof(int))。