我继续传递并返回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; }
答案 0 :(得分:10)
运算符sizeof
是一个编译时功能,它只检查表达式的静态大小。因此对于指针,它只返回平台上4指针的大小。 sizeof
不衡量动态分配数据的大小。 C中没有标准功能来获取动态分配数据的大小。
答案 1 :(得分:4)
您的sizeof(struct dirs_later*)
应该像之前一样更改为sizeof(struct dirs_later)
!
sizeof
也是编译时功能。你需要一个像这样的结构来保持大小
struct my_dirs
struct dirs_later *dirs;
int size;
};
像这样初始化
struct my_dirs directories;
directories.size = 0;
directories.dirs = NULL;
然后添加(注意realloc
可以将NULL作为参数
directories.dirs = realloc(directories.dirs,
(++directories.size) * sizeof(struct dirs_later));
这也可以简化您的代码。