【发布时间】:2012-05-18 04:43:25
【问题描述】:
我在调用 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;
}
感谢您的建议!
【问题讨论】:
-
尝试通过 valgrind 运行您的代码
-
为什么甚至分配了 idx 而不仅仅是一个 int?
-
使用调试器将帮助您解决问题。那么你就不需要像我们这样依赖随机数来做你的工作了。
-
第一次调用
realloc时,i将为零,因此您将重新分配为 0 个字节。 -
@TimothyJones, pdir 定义如下: typedef struct s_direct *pdir;它是在
上声明的指向 s_direct 的指针