我继续传递并返回dirs_later_array . 当我在else块中找到“new_size = ...”时,我第二次得到new_size为2 . 到现在为止还挺好 . 但是当我做一个realloc
dirs_later_array = realloc(dirs_later_array,
new_size * sizeof(struct dirs_later*));
对于dirs_later_array,sizeof保持为4,即指针的大小 . 我能够成功地存储在dirs_later_array [1],但是下次进入函数时该值会被覆盖 .
struct dirs_later** add_struct(const char *findme, struct dirent *dptr,
struct stat *this_lstat, char *relative_path, const char *type_str,
struct dirs_later **dirs_later_array) {
struct dirs_later *new_dir = malloc(sizeof(struct dirs_later));
check_realloc_dirs_error(new_dir);
if (strcmp(dptr->d_name, ".")) { //Dir and not same directory
//Copy the relative path to the struct
char *relative_path2;
relative_path2 = malloc(strlen(relative_path) + 1);
check_realloc_error(relative_path2);
strcpy(relative_path2, relative_path);
//if (strlen(relative_path) > 0)
// relative_path2[strlen(relative_path) - 1] = '\0';
if (NULL != new_dir) {
new_dir->findme = findme;
new_dir->dptr = dptr;
new_dir->st_mode = this_lstat->st_mode;
new_dir->relative_path = relative_path2;
new_dir->type_str = type_str;
}
int new_size = 0;
/*
//Check if this is the first element in the struct
if (sizeof(dirs_later_array) / sizeof(struct dirs_later*) == 1) {
new_size = 1;
}
*/
if (dirs_later_array == NULL) {
dirs_later_array = malloc(sizeof(struct dirs_later*)); //Store the directory structures or process later
check_realloc_arr_error(*dirs_later_array);
new_size = 1;
} else {
//Add directories to directories array
new_size = (((sizeof(dirs_later_array) + sizeof(struct dirs_later*)))/sizeof(struct dirs_later*));
//printf("new size: %d",new_size);
}
dirs_later_array = realloc(dirs_later_array,
new_size * sizeof(struct dirs_later*));
check_realloc_arr_error(dirs_later_array);
dirs_later_array[new_size - 1] = new_dir;
}
return dirs_later_array;
}
2 回答
运算符
sizeof
是编译时功能,它仅检查表达式的静态大小 . 因此对于指针,它只返回平台上4指针的大小 .sizeof
不测量动态分配数据的大小 . C中没有标准功能来获取动态分配数据的大小 .您的
sizeof(struct dirs_later*)
应该像以前一样更改为sizeof(struct dirs_later)
!sizeof
也是一个编译时功能 . 你需要一个像这样的结构来保持大小像这样初始化它
然后添加(注意
realloc
可以将NULL作为参数这也可以简化您的代码 .