1

入力としてファイル名 (main.c など) を受け取り、strsep() を使用してファイル拡張子を返す一連の関数を作成しようとしています。プログラムを実行すると、strsep 関数が呼び出されるたびにバス エラーが発生します。コードは次のとおりです。

static char *get_extn(char **filename)
{
        char *delim = ".";
        strsep(filename, delim);

        return *filename;
}

void format(char *filename)
{
        char *extn = malloc(256 * sizeof(char));

        strncpy(extn, get_extn(&filename), 256);
        printf("extn: %s\n", extn);
}

このプログラムのメイン関数は、ファイル名を含む char* を指定して format() を呼び出すだけです。

int main(int argc, char *argv[])
{
        char *filename = "test.c";
        format(filename);

        return 0;
}

このプログラムを実行するとバス エラーが発生する理由がわかりません。あなたが提供できる助けを前もって感謝します。

編集:メイン関数コードを追加

4

1 に答える 1

1

文字列リテラルのメモリは、書き込み可能であるとは限りません。

行う

char filename[] = "test.c";

代わりに書き込み可能な char 配列を作成します。

私のシステムでは、このメモリは読み取り専用として保護されており、この保護に違反しようとするとセグメンテーション違反が発生します。

また、get_ext は単純に次のようになります。

return strsep(filename, ".");

1とsizeof(char)定義されています (1 バイト、つまり、そのバイトが 8 ビット (まれ) でなくても)。

于 2016-04-03T22:55:40.410 に答える