我在列出文件夹中的文件时遇到问题。
这里的奇怪之处在于它可以正常工作几次,但之后程序正在调用其他函数,之后再运行该函数以列出文件。
我添加了一个 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");
}
答案 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);