C - Realloc无效的下一个大小w字符串

时间:2014-07-01 22:55:45

标签: c realloc

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

这里的奇怪之处在于它可以正常工作几次,但之后程序正在调用其他函数,之后再运行该函数以列出文件。

我添加了一个 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");
}

1 个答案:

答案 0 :(得分:1)

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 
}

NB。该算法效率很低(每次调用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);
相关问题