C - 重新分配无效的下一个大小的字符串

标签 c realloc

我在 C 语言中列出文件夹中的文件时遇到问题。

这里奇怪的是,它运行良好几次,但随后程序调用其他函数,然后再次运行列出文件的函数。

我添加了一个print malloc_usable_size - 它说有足够的空间,但当它突破时它说0。

此外,当ent->d_name被破坏时,会有一些奇怪的字符。

最后出现错误:realloc(): invalid next size

你有什么想法吗?

这是代码:

struct dirent *ent;
int size = 6;
char *file_names = NULL, *temp = NULL;
while((ent=readdir(dirp))!=NULL) {
  if( (strcmp(ent->d_name, ".")!=0) && (strcmp(ent->d_name, "..")!=0) ) {
    size += strlen(ent->d_name)*sizeof(char) + 6;
    temp = file_names;
    file_names = (char *) realloc(file_names, size);
    if(file_names != NULL) {
      strcat(file_names, ent->d_name);
      strcat(file_names, "\n\0");
    }
    else {
      file_names = temp;
    }
  }
}
closedir(dirp);
if(file_names != NULL) {
  strcat(file_names, "\0");
}

最佳答案

strcat 附加到字符串的末尾。但你永远不会从一根绳子开始;第一次调用 realloc 会获取未初始化的内存。也许您第一次获得零字节,但在其他函数使用并释放内存后,下次分配内存时它会以非零字节开始。

您需要在第一次分配后设置file_names[0] = 0;。 (例如 if ( temp == NULL ) file_names[0] = 0;

顺便说一句,更常见的是使用此模式进行realloc:(和 don't cast it )

temp = realloc(file_names, size);
if ( temp != NULL )
{
    if ( file_names == NULL ) 
        temp[0] = 0;

    file_names = temp;  
    strcat(file_names, ent->d_name);
    strcat(file_names, "\n");   // extra \0 is redundant 
}
<小时/>

注意。该算法效率相当低(每次调用 strcat 都必须再次扫描整个字符串)。您可以存储当前偏移量;这也可以解决您的初始 strcat 问题。例如。 (伪代码)

// before loop
size_t offset = 0;

// in the loop; after allocating the right amount of memory as before
offset += sprintf(file_names + offset, "%s\n", ent->d_name);

关于C - 重新分配无效的下一个大小的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24520406/

相关文章:

c - 这个字符缓冲区代码有什么问题?

c - malloc 和 realloc 数组给出意外输出

c - 在redis中存储 "unordered set"整数作为值的有效方法?

c - malloc 不确定性行为

c++ - 如何从 cvNamedWindow 保存图像

c - 在内存中排序值时重新分配的最有效方法?

c - realloc 和 malloc 函数

c - 是否有必要在关闭 epoll 实例本身之前删除兴趣列表中的所有文件描述符?

c - 为什么没有打印任何内容? C语言编程

swift - 使用 Float 数组在 Swift 中调用 "realloc"的正确方法?