0

関数から文字列を返すのに問題があります。メインメソッドでガベージ値を出力します。このフォーラムで同様の質問を見ましたが、そのページの結果は役に立ちませんでした。関数に別の変数を渡したくありません。文字列値をそのまま返せるようにしたいです。どうすればそうすることができますか?

char *LookupPath(char **argv, char **dir)
{
    /* String Name To Be Returned */
    char path_name[MAX_PATH_LEN] = {0};
    char *result = malloc(sizeof(path_name));
    int i;

    /* Check To See If File Name Is Already An Absolute Path Name */
    if(*argv[0] == '/') {

    }

    /* Look In Path Directories */
    for(i = 0; dir[i] != NULL; i++) {
        strncat(path_name, dir[i], sizeof(path_name));
        strncat(path_name, "/", sizeof(path_name));
        strncat(path_name, argv[0], sizeof(path_name));
        result = path_name;
        if(access(result, F_OK) == 0) {
            printf("result: %s\n", result);
            return result;
        }
        path_name[0] = '\0';
    }

    /* File Name Not Found In Any Path Variable */
    return NULL;
}

あなたの助けは大歓迎です!

4

4 に答える 4

4
result = path_name;

次のようにする必要があります。

strcpy(result, path_name);

または、削除して直接path_name使用することをお勧めresultします。

使用されていないときは解放することを忘れないでください。それをresult返すときは、それを呼び出す関数で解放してください。失敗して戻ってくるのでNULL、その場合は直接解放しないとメモリリークです。

そして、あなたはstrncat間違った使い方をしています。マニュアルを読んでください。

于 2013-10-22T05:38:39.030 に答える
2

関数からローカル配列 ( など) を返すことはできませんpath_name。そのローカル配列はcall frame内にあり、戻り時にポップされます。

他の人が答えたように、あなたはそうすべきです

strncpy(result, path_name, MAX_PATH_LEN);

呼び出し元が結果を解放する必要があるという規則を文書化します。

ところで、あなたのコードは非常に非効率的です。多くの場合、はるかに小さい文字列にかなり大きなチャンクMAX_PATH_LEN(多くの場合 4096) を割り当てています。

GNU 拡張機能を使用する場合は、単純にasprintf(3) (このを参照) を使用するか、少なくともmallocandを削除してstrdup(3)return strdup(path_name);を使用できます(これは標準であり、GNU 拡張機能は必要ありません)。

そしてvalgrindの使い方を学びましょう。

于 2013-10-22T05:37:51.363 に答える
2

path_name実際に保持できる以上の値を割り当てています。

    strncat(path_name, dir[i], sizeof(path_name));
    strncat(path_name, "/", sizeof(path_name));
    strncat(path_name, argv[0], sizeof(path_name));

次のようにする必要があります。

    sprintf(path_name, "%s%s%s", dir[i],"/",argv[0]);
于 2013-10-22T05:52:14.240 に答える
1

この行のため:

result = path_name;

これは、関数が戻るときにスコープ外になるローカル変数を指すように再割り当てします。 これは、メモリリークがあることも意味します。resultpath_name

一時変数を使用する代わりに、path_nameに直接書き込みますresult

于 2013-10-22T05:38:50.093 に答える