外部变量C.

时间:2012-07-29 01:12:43

标签: 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?
    ...

}

我无法解决这个问题,我还需要在myheader.c中声明extern变量吗?

3 个答案:

答案 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变量分配一些内存。