1

产生的错误是:分段错误

我的头文件

#ifndef datest
#define datest
struct date{
    char c;
    FILE* gestor;
};

typedef struct date dateStruct;
extern dateStruct date_Struct;

void loadLine();
#endif

我的主程序

#include "myheader.h"
...

dateStruct date_Struct;

int main(int argc,char* argv[]){
        date_Struct.gestor = fopen(argv[1],"r");
        loadLine();
}

我的头文件.c

#include "myheader.h"

void loadLine(){
    char* TEXT;
    fscanf(date_Struct.gestor, "%s\n", TEXT);  //ERROR! why?
    ...

}

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

4

3 回答 3

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

TEXT 未初始化;它很可能指向垃圾,因此您的程序在尝试写入时会出现段错误。

您需要预先为 TEXT 分配内存,无论是在堆栈中还是使用malloc()(或其朋友)。

于 2012-07-29T01:17:02.617 回答
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();它会告诉您它是否按预期工作。习惯于检查错误返回。总是有必要知道如何处理错误,并且通常有很多代码专门用于这样做。

于 2012-07-29T01:16:58.627 回答
1

当您尝试访问您无法访问的内容时,会发生“分段错误”,或者通常称为段错误。在您的情况下,fscanf(date_Struct.gestor, "%s\n", TEXT);您使用TEXT变量而不初始化它。

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

于 2012-07-29T01:18:03.283 回答