我在使用malloc调用时遇到了一些麻烦。问题是这个调用是在我的程序上调用两次的函数。 函数的第二个malloc仅在我第二次调用此函数时崩溃。我尝试交换一些当时的顺序甚至驱逐一个..在第一种情况下,第二个malloc(最初是第一个)崩溃了,而在第二个案例中,它崩溃了一个realloc,后面出现在同一个函数中。此外,我尝试在第二次调用之前调用我的函数一次并且继续在(新)第二次调用时崩溃。谁能帮我?这是我的代码:
int main(int argv, char *argc[]){
fsys = malloc(sizeof(struct ext2system)); // Global pointer var
getsysdata();
list_dir(fsys->root);
// list_dir(fsys->root); // IF THIS LINE IS UNCOMMENTED,
// THE PROGRAM CRASHES ON THIS CALL
// IF NOT, IT CRASHES ON data = get_cont(fsys->root);
pdir dir = malloc(sizeof(struct s_direct));
int* data;
int offs, i;
data = get_cont(fsys->root);
offs = 0;
for (i = 0; i < fsys->root->i_links_count + 2; ++i) {
offs += readdirent(getblock(data[0])+offs, dir);
printf("%.*s\n", dir->name_len, dir->name);
if(dir->file_type==1) printf("%s\n", data);
}
unmap(fsys->diskmap);
return 0;
}
void list_dir(pinode inod){
// Lists a directory contents
pdir dir = malloc(sizeof(struct s_direct));
int* data;
int offs, i;
data = get_cont(inod);
offs = 0;
for (i = 0; i < inod->i_links_count + 2; ++i) {
offs += readdirent(getblock(data[0])+offs, dir);
printf("%.*s\n", dir->name_len, dir->name);
}
}
int *get_cont(pinode inod){
// Recupera contenido de los blocks de datos de un inodo
int *cont=NULL;
int *idx=NULL;
int i=0;
int *block;
cont = malloc(sizeof(int));
idx = malloc(sizeof(int)); // HERE IS WHERE THE PROGRAM CRASHES
// EVEN IF MALLOCS ARE SWAPPED
while(i < inod->i_blocks && i<13) {
// Recupera los 12 primeros bloques directamente
realloc(cont, i*sizeof(int)); // CRASHED HERE WHEN
// I DELETED ONE MALLOC
cont[i]=inod->i_block[i];
i++;
}
if(i < inod->i_blocks){
*idx=13;
block=(int*)getblock(inod->i_block[*idx]);
fetchcont(block, idx, cont, inod->i_blocks, 0);
}
if(i < inod->i_blocks){
block=(int*)getblock(inod->i_block[*idx]);
fetchcont(block, idx, cont, inod->i_blocks, 1);
}
if(i < inod->i_blocks){
block=(int*)getblock(inod->i_block[*idx]);
fetchcont(block, idx, cont, inod->i_blocks, 2);
}
return cont;
}
感谢您的建议!
答案 0 :(得分:2)
这部分肯定是一个问题(缩短的片段):
int i = 0;
cont = malloc(sizeof(int));
while(i < inod->i_blocks && i<13) {
realloc(cont, i*sizeof(int));
第一次通过时,i
在重新分配呼叫时将为零。 malloc()
手册页说:
realloc()
将ptr指向的内存块的大小更改为size字节。内容将保持新旧尺寸的最小值;新分配的内存将是未初始化的。如果ptr为NULL,则对于所有大小值,调用等效于malloc(size)
; 如果size等于零,并且ptr不为NULL,则调用 相当于free(ptr)
。除非ptr为NULL,否则必须先前调用malloc()
,calloc()
或realloc()
。如果指向的区域已移动,则free(ptr)
已完成。
然后你去:
cont[i]=inod->i_block[i];
你将写入你刚刚释放的内存(或者,当i
非零时,你将只是写你已经分配的内存)。这可能是任何事情 - 您可能会覆盖malloc()
的内部结构,这可能会导致稍后调用malloc或free的崩溃。
此外,在realloc(cont, 0)
之后,cont
将不再是malloc()
返回的指针(因为它就好像你写了free(cont);
),它也是不会为空。当i
为1时,这几乎肯定会崩溃。
你可能意味着:
realloc(cont, (i+1)*sizeof(int));
代替。
答案 1 :(得分:1)
alloc函数崩溃意味着你已经踩到了簿记数据。在getsysdata()或list_dir()调用树中的某个地方,你通过一个错误的指针进行分配,这个指针恰好远远超过了你认为它指向损坏malloc数据的任何结尾。可能更糟糕的是,你的覆盖可能会踩到你关心的数据。