gpt4 book ai didi

c - linux 上的 memcpy 段错误,但 os x 上没有

转载 作者:太空狗 更新时间:2023-10-29 15:12:41 26 4
gpt4 key购买 nike

我正在为文件实现一个基于日志的文件系统作为一个类项目。我在我的 64 位 OS X 笔记本电脑上运行了大量它,但是当我尝试在 CS 部门的 32 位 Linux 机器上运行代码时,我遇到了段错误。

我们提供的 API 允许一次写入 DISK_SECTOR_SIZE (512) 个字节。我们的日志记录由用户想要写入的 512 字节以及一些元数据(他想要写入哪个扇区、操作类型等)组成。

总而言之,“记录”对象的大小为 528 字节,这意味着每条日志记录跨越磁盘上的 2 个扇区。

第一条记录在扇区 0 上写入 0-512,在扇区 1 上写入 0-15。第二条记录在扇区 1 上写入 16-512,在扇区 2 上写入 0-31。第三条记录在扇区 2 上写入 32-512,在扇区 3 上写入 0-47。等等。

所以我所做的是将我将修改的两个扇区读取到 2 个新分配的缓冲区中,从记录开始复制到 buf1+计算的 512 偏移字节的偏移量。这在两台机器上都能正常工作。

但是,第二个 memcpy 失败了。具体来说,以下代码段错误中的“record+DISK_SECTOR_SIZE-offset”,但仅在 linux 机器上。运行一些随机测试,它会变得更好奇。 linux 机器报告 sizeof(Record) 为 528。因此,如果我尝试从 record+500 memcpy 到 buf 1 字节,它应该没有问题。

事实上,我可以从记录中获得的最大偏移量是 254。也就是说,memcpy(buf1, record+254, 1) 可以工作,但是 memcpy(buf1, record+255, 1) 会出现段错误。

有人知道我错过了什么吗?

Record *record = malloc(sizeof(Record));
record->tid = tid;
record->opType = OP_WRITE;
record->opArg = sector;
int i;
for (i = 0; i < DISK_SECTOR_SIZE; i++) {
record->data[i] = buf[i]; // *buf is passed into this function
}

char* buf1 = malloc(DISK_SECTOR_SIZE);
char* buf2 = malloc(DISK_SECTOR_SIZE);

d_read(ad->disk, ad->curLogSector, buf1); // API to read a specified sector into a buffer
d_read(ad->disk, ad->curLogSector+1, buf2);

memcpy(buf1+offset, record, DISK_SECTOR_SIZE-offset);
memcpy(buf2, record+DISK_SECTOR_SIZE-offset, offset+sizeof(Record)-sizeof(record->data));

最佳答案

当您将 1 加到指针 p 时,您不是在添加 1 个字节,而是在添加 sizeof(p) 个字节。

所以在这种情况下,您需要在添加之前将record 转换为char*。现在 record+500 实际上指向 record 500*528 = 264,000 字节。

当然,这并不能解释为什么 memcpy(buf, record+254, 1) 不会出现段错误。我猜只是“幸运”。

关于c - linux 上的 memcpy 段错误,但 os x 上没有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2602305/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com