C malloc只在第二次通话时崩溃

时间:2012-05-18 04:43:25

标签: c crash malloc call

我在使用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;

}

感谢您的建议!

2 个答案:

答案 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数据的任何结尾。可能更糟糕的是,你的覆盖可能会踩到你关心的数据。