我需要一个节省内存的读取行版本。我有这个“有效”的解决方案。但我不确定它与内存的关系如何。当我启用 free(text)
时,它会运行几行,然后出现错误。因此,尽管我分配了文本,但现在文本和结果都没有被释放。那是对的吗 ?为什么会这样?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* readFromIn()
{
char* text = malloc(1024);
char* result = fgets(text, 1024, stdin);
if (result[strlen(result) - 1] == 10)
result[strlen(result) - 1] = 0;
//free(text);
return result;
}
我有很多短行可以用它来读取,我还需要用FILE*
句柄替换stdin。我不需要重新分配文本,因为我只有短行。
最佳答案
fgets
返回指向字符串的指针,因此在 fgets
行之后,result
将与 text 具有相同的内存地址
。然后,当您调用 free (text);
时,您将返回无效内存。
完成结果
后,您应该释放调用函数中的内存
您还可以通过构造代码来传递缓冲区来避免 malloc/free 的东西,如下所示:
void parent_function ()
{
char *buffer[1024];
while (readFromIn(buffer)) {
// Process the contents of buffer
}
}
char *readFromIn(char *buffer)
{
char *result = fgets(buffer, 1024, stdin);
int len;
// fgets returns NULL on error of end of input,
// in which case buffer contents will be undefined
if (result == NULL) {
return NULL;
}
len = strlen (buffer);
if (len == 0) {
return NULL;
}
if (buffer[len - 1] == '\n') {
buffer[len - 1] = 0;
return buffer;
}
如果您正在处理许多小而短暂的项目,那么尝试避免 malloc/free 可能是明智的,这样内存就不会碎片化,并且速度也应该更快。
关于C - 如何从标准输入或文件内存保存读取字符串行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14851925/