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()
过的返回值;它会告诉你它是否按照你的预期工作。习惯于检查错误返回。知道如何处理错误总是很有必要的,而且很多代码通常都会致力于这样做。
答
fscanf(date_Struct.gestor, "%s\n", TEXT); //ERROR! why?
TEXT未初始化;它很可能指向垃圾,所以当你尝试写入它时,你的程序会出现段错误。
你需要事先分配文本内存,无论是在堆栈或使用malloc()
(或朋友)。
答
中“segmentation fault”,或段错误,因为它是更普遍的称呼,当您尝试访问的东西,你不能发生。在你的案例fscanf(date_Struct.gestor, "%s\n", TEXT);
你使用TEXT
变量没有初始化它。
您需要首先分配一些内存为TEXT
变量。
问题解决了,谢谢你! – Sark 2012-07-29 01:22:52