我在 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/