生成的错误是:分段错误
Myheader.h
#ifndef datest
#define datest
struct date{
char c;
FILE* gestor;
};
typedef struct date dateStruct;
extern dateStruct date_Struct;
void loadLine();
#endif
myMain.c
#include "myheader.h"
...
dateStruct date_Struct;
int main(int argc,char* argv[]){
date_Struct.gestor = fopen(argv[1],"r");
loadLine();
}
MyHeader.c
#include "myheader.h"
void loadLine(){
char* TEXT;
fscanf(date_Struct.gestor, "%s\n", TEXT); //ERROR! why?
...
}
我无法解决这个问题,我还需要在myheader.c中声明extern变量吗?
答案 0 :(得分:4)
fscanf(date_Struct.gestor, "%s\n", TEXT); //ERROR! why?
TEXT未初始化;它很可能指向垃圾,所以你的程序在尝试写入时会出现段错误。
您需要事先在堆栈中或使用malloc()
(或其朋友)为TEXT分配内存。
答案 1 :(得分:3)
可能会发生分段错误,因为文件未成功打开且date_Struct.gestor
是NULL指针。
始终检查fopen()
- 的返回值!它可能会失败,如果使用空指针,则会出现分段错误。
另一个问题是TEXT
(不要对变量使用全大写;使用小写或驼峰大小写并为宏保留全部大写)。
指针TEXT没有指向任何地方;它没有初始化。当你阅读它时,所有的地狱都会破裂。 (指针可能指向任何位置;在最坏的情况下,它指向某个有效但意外的地方,您的fscanf()
'有效',但是您会践踏某些数据并且您不知道它是如何被破坏的。错误是幸运的;它告诉你一些事情显然是错误的。)这更可信地是你的问题。
void loadLine()
{
char TEXT[4096];
if (fscanf(date_Struct.gestore, "%s\n", TEXT) != 1)
...process error...
检查fscanf()
的返回值;它告诉你它是否按预期工作。习惯于检查错误返回。总是有必要知道如何处理错误,并且通常会花很多代码来执行此操作。
答案 2 :(得分:1)
当您尝试访问无法访问的内容时,会发生“分段错误”或更常见的段错误。对于fscanf(date_Struct.gestor, "%s\n", TEXT);
行,您可以使用TEXT
变量而不进行初始化。
您需要先为TEXT
变量分配一些内存。