首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >法研误差-fget打印

法研误差-fget打印
EN

Stack Overflow用户
提问于 2013-08-14 22:11:16
回答 2查看 488关注 0票数 1

我试图从文件中读取一行并打印出来。

代码语言:javascript
运行
复制
char *readLine(int n, FILE *file) {
    int i;
    int BUF=255;
    char temp[BUF];
    char puffer[BUF];
    for(i = 0; i < n-1; i++)
    if(fgets(temp, BUF, file) == NULL)
        return NULL; 

    if(fgets(puffer,BUF,file) == NULL)
        return NULL; 
    return puffer; 
}

如果我这样做,我不会出错:

代码语言:javascript
运行
复制
char * temp=readLine(2,somefile);

但只要我

代码语言:javascript
运行
复制
printf("%s",temp);

瓦兰返回跟随错误

代码语言:javascript
运行
复制
Conditional jump or move depends on uninitialised value(s)
at 0x402EC04:strcrnul(in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
...
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-14 22:28:43

您正在返回一个存在于堆栈上的字符数组。当readLine完成执行时,puffer的内存将自动消失。

您需要在堆上分配内存。一个快速的解决办法是这样做:

代码语言:javascript
运行
复制
char *readLine(int n, FILE *file) {
int i;
int BUF=255;
char temp[BUF];
char puffer[BUF];
char* returned_string;
for(i = 0; i < n-1; i++)
    if(fgets(temp, BUF, file) == NULL)
        return NULL; 

if(fgets(puffer,BUF,file) == NULL)
    return NULL; 

returned_string = malloc (strlen (puffer) + 1);
strcpy (returned_string, puffer);

return returned_string; 
}

不过,在您的功能中并不需要两个缓冲区。

票数 2
EN

Stack Overflow用户

发布于 2013-08-14 22:30:24

你得把必要的记忆弄清楚。现在,您将返回一个指向函数堆栈上的变量的指针。这可能在函数返回后不再存在,因此您需要一些未定义的行为。

变化

代码语言:javascript
运行
复制
char puffer[BUF];

转到

代码语言:javascript
运行
复制
char* puffer = malloc(BUF);

在你准备好之后,别忘了释放这个记忆。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18243190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档