有一个加载文件的功能:

int loadfile(char *fn)
{
    printf( "\n my path: '%s' \n", fn );
    FILE *f = fopen( fn, "r");
    printf( "got\n" );

    ...

    return 1;
}

第一个文件位于main() newfile( argv[1] ); ,有效。 第二个是通过弹性解析/读取第一个文件获得的,我相信与该问题无关。

控制台:

path: 'file1.hot' 
got
path: 'file2.hot' 
Segmentation fault: 11

printf能够打印char * fn,但是fopen出现分段错误。

下一种情况是,我尝试显式地将文件放入装入文件中, loadfile执行fopen( "file2.hot", "r"); 和工作。

我正在用g ++进行编译,当使用c ++来使用char *或fopen时,有一种不同的方法?

编辑

抱歉,没有newfile( argv[1] ); 正确: loadfile( argv[1] );

===============>>#1 票数:2 已采纳

一般说明:使用C ++时,请首选std::fstream而不是C风格的fopen / fread / etc。 还更喜欢std::stringchar* 仅后者会治愈许多记忆性头痛。 如果由于某种原因必须使用C样式的函数,请确保检查返回值(如此处其他答案中所述)-例如, fopen在失败时返回NULL指针。

更具体地针对您的问题:尝试在gdb下运行程序(例如gdb <your-program> ),以查看细分错误的确切位置; 这样,您还可以看到更多详细信息(例如,变量内容等)。 或者,如果在Linux下工作,则使用分析工具(如valgrind)检测任何类型的内存访问问题。

===============>>#2 票数:1

学习使用GDB调试器(假设您在Linux上)或valgrind实用程序。 也许将文件路径放在std :: string中是值得的,并且,如nyarlathotep所述,请使用std :: fstream

您的fn可能不会以null终止。

g++ -Wall -g编译

正如Anders K回答的那样,请始终针对NULL检查fopen的结果。 Pierre Vittet对GCC的Talpo扩展(用MELT编码)能够自动检查您是否进行了检查。

===============>>#3 票数:1

您应该始终检查具有返回值的函数的返回值。 在这种情况下,请确保在打开文件时返回句柄不是NULL,并且还要确保是否打开文件来将其关闭。

  ask by Ratata Tata translate from so

未解决问题?本站智能推荐: