0

簡単なプロジェクトに取り組んでいますが、エラーが発生しました。私はUnixでコーディングし、ターミナルでコードを実行しています。

#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
    int atis;
    char *weather;

    //Création du fichier ATIS
    if((atis = creat("atis", 0666)) == -1)
    {
        printf("Error while creating the ATIS file\n");
        exit(-1);
    }

    //Ouverture du fichier ATIS
    if((atis = open("atis", 0666)) == -1)
    {
        printf("Permission denied\n");
        exit(-1);
    }

    //Mise à jour du fichier ATIS
    printf("OK or KO for a take-off? ");
    gets(weather);
    if(write(atis, weather, sizeof(weather))==-1)
    {
        printf("Write error\n");
        exit(-1);
    }


    close(atis);
    return 0;
}**

エラーは、セグメンテーション違反 11 です。

前もって感謝します!(そして私の英語でごめんなさい、本当に下手です^^)

4

5 に答える 5

5

weatherchar*次の呼び出しで最初に使用されたときは、ユニット化されています。

gets(weather);

つまりgets()、メモリへの書き込みを試みてはならないため、セグメンテーション違反が発生します。配列にメモリを割り当てるweatherか、配列を使用します。

char weather[128];

後続の呼び出しでは、読み取られた文字のみを書き込む代わりにwrite()使用します (また、が aであり ではないケースを正しく処理します)。strlen(weather)sizeof(weather)weatherchar*char[]

さらに、gets 関数が非常に危険なため使用すべきでないのはなぜですか? を参照してください。. 代わりにfgets()orを長さ指定子と共に使用してください。scanf()

于 2013-01-15T14:56:38.257 に答える
2

ポインターにメモリを割り当てることはありません。char *weather;

マニュアルページから:

char *gets(char *s);
gets() は、改行または EOF が終了するまで、stdin から s が指すバッファーに行を読み取ります。

したがって、それを格納するためのバッファが必要です。

char weather[10];

また

char *weather;
weather = malloc(10);

10で十分な場合はそれを行います。これは、man ページからの別のポイントにつながります。

gets() を使用しないでください。データを事前に知らずに gets() が読み取る文字数を知ることは不可能であり、gets() はバッファーの末尾を超えて文字を格納し続けるため、使用するのは非常に危険です。コンピューターのセキュリティを破るために使用されています。代わりに fgets() を使用してください。

元:

fgets (weather, 10 , stdin);
于 2013-01-15T14:57:00.720 に答える
2

問題は次の 2 行です。

char *weather;

gets(weather);

weather最初のものはポインターであると宣言していますが、初期化されていません (つまり、一見ランダムな場所を指しています)。2 行目は、何weatherを指すかを書き込みます。これは、ランダムな場所に書き込むことを意味します。

weather配列として宣言し、fgets代わりに次を使用します。

char weather[64];

/* ... */

fgets(weather, sizeof(weather), stdin);
于 2013-01-15T14:57:52.163 に答える
0

割り当てられたメモリを指していないポインターで get(weather) を実行します。

于 2013-01-15T14:58:37.893 に答える
0
char *weather;

その後

gets(weather);

セグメンテーション違反を引き起こします。これweatherは、メモリ空間を指す必要があります。

  • スタティック

    char weather[100]

  • または動的

    char *weather = malloc(100*sizeof(char));

于 2013-01-15T14:58:53.760 に答える