0

dirnameLinux 用の C で記述されたコードでパスをディレクトリとファイル名に分割するために使用している API が原因で、プログラムでセグメンテーション フォールト (segfault) が発生しています。

dirmaneこちらbasenameの手順に従って、ディレクトリ名を取得するために使用され、ファイル名を取得するために使用されます。

必要最小限のコードを以下に示します。これは、Linux 上で正常にコンパイルおよび実行されます。

#include <stdio.h>
#define _GNU_SOURCE         
#include <string.h>

void main (void)
{
    char *dirc, *basec, *bname, *dname = NULL;
    char *path = "."; /* I compile this code, for different paths as given below*/

    dirc = strdup(path);
    basec = strdup(path);
    dname = dirname(dirc);
    if (dname == NULL)
    {
        /* precautionary check */
        printf("null pointer\n");
    }
    bname = basename(basec);
    printf("dirname=%s, basename=%s\n", dname, bname);
}

変数にさまざまな種類の文字列を指定して、pathこれらが「ディレクトリ」と「ファイル名」にどのように分割されるかを確認します。上記のリンクにあるサンプルに従って、最終結果を期待しています (クイック リファレンスのために以下に貼り付けます)。

ここに画像の説明を入力

次のサンプルのいずれかとしてパスを設定すると、SegFault が発生しますdirname(コメントアウトすると、segfault は発生しません)。

*path = "."
*path = ".."
*path = "usr"
*path = "usr/"

上記の表によると、SegFault ではなく「.」へのポインターを取得する必要があります。このような場合、ディレクトリ名による文字列。segfaultが発生するため、取得できません。上記のように、null ポインターの問題をキャッチするために、null 文字列のチェックも追加しましたが、プログラムはそこにも到達しません。

この質問で不足している情報や不完全な情報がある場合はお知らせください。

4

1 に答える 1

2

libgen.h を含めないため、dirname が宣言されていないため、int を返すと想定されるため、プログラムが破損し、segfault が発生します。

于 2016-01-05T09:03:30.927 に答える