EXTERN变量C

问题描述:

误差产生是:分段故障EXTERN变量C

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? 
    ... 

} 

我不能解决这个问题,我需要在myhea中声明extern var der.c呢?

可能会出现分段错误,因为文件未成功打开,date_Struct.gestor是空指针。

检查返回值从fopen() - 总是!它可能会失败,并且如果您使用空指针,则会出现分段错误。

另一个问题是与TEXT(不要使用全部大写的变量;使用小写或骆驼大小写,并为宏保留全部大写)。

指针TEXT不指向任何地方;它没有被初始化。当你阅读它时,所有的地狱都会崩溃。 (指针可能指向任何地方;在最坏的情况下,它指向某个有效但意想不到的地方,您的fscanf()'有效',但是你践踏了一些数据,并且你不知道它是如何被破坏的。它告诉你有什么显然是错误的。)这更可能是你的问题。

void loadLine() 
{ 
    char TEXT[4096]; 
    if (fscanf(date_Struct.gestore, "%s\n", TEXT) != 1) 
     ...process error... 

检查从fscanf()过的返回值;它会告诉你它是否按照你的预期工作。习惯于检查错误返回。知道如何处理错误总是很有必要的,而且很多代码通常都会致力于这样做。

+0

问题解决了,谢谢你! – Sark 2012-07-29 01:22:52

fscanf(date_Struct.gestor, "%s\n", TEXT); //ERROR! why? 

TEXT未初始化;它很可能指向垃圾,所以当你尝试写入它时,你的程序会出现段错误。

你需要事先分配文本内存,无论是在堆栈或使用malloc()(或朋友)。

中“segmentation fault”,或段错误,因为它是更普遍的称呼,当您尝试访问的东西,你不能发生。在你的案例fscanf(date_Struct.gestor, "%s\n", TEXT);你使用TEXT变量没有初始化它。

您需要首先分配一些内存为TEXT变量。