Realloc不调整指针数组的大小

我不断传球并返回dirs_later_array。 当我在else块中得到“new_size = ...”时,我第二次得到2的new_size。 到现在为止还挺好。 但是当我做一个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] = '';

        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;
}




运算符sizeof是一个编译时功能,它只检查表达式的静态大小。 所以对于指针而言,它只会返回平台上指针的大小。 sizeof不测量动态分配的数据的大小。 C中没有标准功能来获取动态分配数据的大小。


你的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));

这也会简化你的代码。

链接地址: http://www.djcxy.com/p/85949.html

上一篇: Realloc is not resizing array of pointers

下一篇: type checking across source files