gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:31:51 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com