为什么fclose()会失败?

时间:2016-06-11 10:46:31

标签: file fread fclose

请查看以下代码:

import 'core-js/fn/object/assign';
import React from 'react';
import ReactDOM from 'react-dom';
import { Router, Route, browserHistory,IndexRoute } from 'react-router';

// Custom Components
import App from './components/Main';
import Dashboard from  './components/containers/Dashboard';
import Settings from  './components/containers/Settings';
import Workspace from  './components/containers/Workspace';
import Main from  './components/Main';

ReactDOM.render((

  <Router histrory={browserHistory}>
    <Route path="/" component={Main}>
      <IndexRoute component={Dashboard}></IndexRoute>
      <Route path="/workspace" component={Workspace}></Route>
      <Route path="/dashboard" component={Dashboard}></Route>
      <Route path="/settings" component={Settings}></Route>
    </Route>
  </Router>


), document.getElementById('app'));

此代码通过编译,但在运行时崩溃。你知道为什么吗?

但是,如果我在fclose()和printf()(代码的最后两行)之间切换,则代码会成功运行并打印&#34; newfile&#34;的内容。这两种情况有什么区别?

2 个答案:

答案 0 :(得分:1)

buf = (char*)malloc(sizeof(file_st.st_size+1));

从此表达式中删除sizeof运算符。我很惊讶它编译。它返回int的大小,即4或8.不是文件的大小。你正在超越缓冲区。

此外,打印fclose()的返回值是徒劳的。如果它返回失败,您需要打印errnostrerror()

答案 1 :(得分:0)

一个好的编译器会告诉你代码中至少有一个错误。来自gcc -Wall -O

a.c:24:5: warning: format ‘%d’ expects a matching ‘int’ argument [-Wformat=]
     printf("fread return value is: %d\n");
     ^

根据您的环境,省略printf的参数可能会导致它打印垃圾,崩溃,打印垃圾和崩溃,什么都不打印,什么都不打印和崩溃,或打印垃圾或什么都没有并使程序的内存处于损坏状态,以便某些操作失败。特别是,缺少的参数可能会导致fclose崩溃,但如果您在其间调用printf,则会将程序的内存恢复为有效状态。无法确定发生了什么是不可能的,因为它完全取决于程序在内存中的排列方式以及它如何与操作系统的期望以及编译器的工作方式相匹配。在C中,当出现问题时,所有投注均已关闭。