我目前正在编写一个方法,该方法从分配的内存块中读取并打印出特定偏移量和指定大小的内容,两者都作为参数传递。我正在使用字符指针来完成这一点,但在行周围不断出现malloc错误
char *content = (char *)malloc(size+1);
方法代码:
int file_read(char *name, int offset, int size)
{
//First find file and its inode, if existing
int nodeNum = search_cur_dir(name);
if(nodeNum < 0) {
printf("File read error: file does not existn");
return -1;
}
//Size check, to avoid overflows/overreads
if(offset > inode[nodeNum].size || size > inode[nodeNum].size || (offset+size) > inode[nodeNum].size) {
printf("File read error: offset and/or size is too largen");
return -1;
}
int i, read_size, track_size = size, content_offset = 0;
int target_block = offset / BLOCK_SIZE; //Defined as constant 512
int target_index = offset % BLOCK_SIZE;
char *raw_content = (char *)malloc(inode[nodeNum].size+1);
printf("check1n"); //Debug statment
for(i = target_block; i < (inode[nodeNum].blockCount-(size/BLOCK_SIZE)); i++) {
disk_read(inode[nodeNum].directBlock[i], raw_content+content_offset);
content_offset += BLOCK_SIZE;
}
printf("check2n"); //Debug statment
char *content = (char *)malloc(size+1);
memcpy(content, raw_content+target_index, size);
printf("%sn", content);
free(raw_content);
free(content);
return 0;
}
和disk_read的代码:
char disk[MAX_BLOCK][BLOCK_SIZE]; //Defined as 4096 and 512, respectively
int disk_read(int block, char *buf)
{
if(block < 0 || block >= MAX_BLOCK) {
printf("disk_read errorn");
return -1;
}
memcpy(buf, disk[block], BLOCK_SIZE);
return 0;
}
节点的结构
typedef struct {
TYPE type;
int owner;
int group;
struct timeval lastAccess;
struct timeval created;
int size;
int blockCount;
int directBlock[10];
int indirectBlock;
char padding[24];
} Inode; // 128 byte
我使用这种方法时遇到的错误是内存损坏
*** glibc detected *** ./fs_sim: malloc(): memory corruption (fast): 0x00000000009f1030 ***
现在奇怪的是,首先,只有在我使用该方法几次后才会出现这种情况——在前两三次尝试中,它会起作用,然后出现错误。例如,这里有一个测试运行示例:
% read new 0 5
z12qY
% read new 0 4
z12q
% read new 0 3
*** glibc detected *** ./fs_sim: malloc(): memory corruption (fast): 0x00000000009f1030 ***
更奇怪的是,当我评论时,这个错误完全消失了
free(raw_content);
free(content);
即使经历了这一切,记忆也会被束缚。我已经阅读了以前关于malloc内存损坏的文章,并理解这通常是由于覆盖内存边界或空间分配不足造成的,但我不知道我在哪里可以做到这一点。我也尝试过malloc的其他大小,当我注释掉释放两个指针的行时,这些大小产生了最好的结果。有人看到我可能缺少的东西了吗?为什么这种情况发生得如此不一致?
代码为字符和null字符分配空间,但不确保数组在打印为字符串之前以null字符终止。
char *content = (char *)malloc(size+1);
memcpy(content, raw_content+target_index, size);
// add
content[size] = ' ';
printf("%sn", content);
可能还有其他问题。
[编辑]
OP码容易产生误编码,并且依赖于inode[]
来具有相干值(.blockCount
. size
)。通过确定循环计数并根据该计数进行分配来澄清和简化。
int loop_count = (inode[nodeNum].blockCount-(size/BLOCK_SIZE)) - target_block;
char *raw_content = malloc(sizeof *raw_content * loop_count * BLOCK_SIZE);
assert(raw_count);
for (loop = 0; loop < loop_count; loop++) {
i = target_block + loop;
disk_read(inode[nodeNum].directBlock[i], raw_content + content_offset);
content_offset += BLOCK_SIZE;
}
还建议检查disk_read()
是否成功