1

生成されるエラーは次のとおりです。セグメンテーション違反

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でもexternvarを宣言する必要がありますか?

4

3 に答える 3

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

TEXTは初期化されていません。おそらくガベージを指しているので、プログラムに書き込もうとするとセグフォールトします。

malloc()スタック内または使用中(またはそのフレンド)のいずれかで、事前にTEXTにメモリを割り当てる必要があります。

于 2012-07-29T01:17:02.617 に答える
3

ファイルが正常に開かれずdate_Struct.gestor、NULLポインターであるため、セグメンテーション違反が発生する可能性があります。

からの戻り値を確認してくださいfopen()常に! 失敗する可能性があり、nullポインターを使用すると、セグメンテーション違反が発生します。

もう1つの問題は、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 に答える