Realloc 没有调整指针数组的大小

Posted

技术标签:

【中文标题】Realloc 没有调整指针数组的大小【英文标题】:Realloc is not resizing array of pointers 【发布时间】:2012-03-17 16:40:32 【问题描述】:

我不断传入并返回 dirs_later_array。当我在 else 块中到达“new_size = ...”时,我第二次得到 new_size 为 2。到目前为止,一切都很好。但是当我重新分配时

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, 结构 dirs_later **dirs_later_array) 结构 dirs_later *new_dir = malloc(sizeof(struct dirs_later)); check_realloc_dirs_error(new_dir); if (strcmp(dptr->d_name, ".")) //目录和不同目录 //复制结构体的相对路径 字符 *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'; 如果(NULL!= new_dir) new_dir->findme = findme; 新目录->dptr = dptr; 新目录->st_mode = this_lstat->st_mode; new_dir->relative_path = relative_path2; new_dir->type_str = type_str; int new_size = 0; /* //检查这是否是结构中的第一个元素 if (sizeof(dirs_later_array) / sizeof(struct dirs_later*) == 1) 新尺寸 = 1; */ 如果(dirs_later_array == NULL) dirs_later_array = malloc(sizeof(struct dirs_later*)); //存放目录结构或稍后处理 check_realloc_arr_error(*dirs_later_array); 新尺寸 = 1; 别的 //将目录添加到目录数组 new_size = ((((sizeof(dirs_later_array) + sizeof(struct dirs_later*)))/sizeof(struct dirs_later*)); //printf("新尺寸:%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; 返回 dirs_later_array;

【问题讨论】:

realloc不会调整任何东西的大小,它只是分配指定为参数的动态内存并将其分配给您的指针。 @Als 但确实如此!它确实会调整大小! @Als - Any 还确保原始内容保持不变(就新的空间量而言) 这是一个基本的 C 和 C++ 规则,即事物的大小不取决于它包含的值。如果不是这种情况,怎么知道要传递给malloc 的大小?您需要值来知道大小,但如果您有放置值的地方,您可能不需要调用 malloc 【参考方案1】:

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

这也将简化您的代码。

【讨论】:

实际上,realloc 是否可以将 NULL 作为参数是依赖于实现的问题。我确实记得多年来我处理过的某些机器上的一些编译器会允许这样做。但是,您不能保证在每台机器上都可以使用它,因此使用该“功能”被认为是不良风格。 en.cppreference.com/w/c/memory/realloc【参考方案2】:

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

【讨论】:

所以基本上我需要一直跟踪数组索引? @user994165:是的,您需要自己跟踪动态分配的数据大小。

以上是关于Realloc 没有调整指针数组的大小的主要内容,如果未能解决你的问题,请参考以下文章

C扩展一个指针数组

用指针创建静态数组?

Visual Studio 警告 C6308 存在于缩小的动态数组中

使用 realloc 和 calloc 增加函数内二维数组的大小

调整数组顺序使奇数位于偶数前面

realloc 使用详解(分析realloc invalid pointer指针无效等错误)