2 D文字列ポインタ

3812 ワード

問題解決:ポインタを使用して、ポインタ関係を柔軟に制御します.例:現在のディレクトリの下にあるファイル名をエクスポートします.
参考博文:1.2 D文字配列とchar**の関係2.C言語における2次元文字配列の定義と初期化3.『Cエキスパートプログラミング』10.2-10.3ポインタ配列(iliffeベクトル)について
次のコードについて考えてみましょう.
void list_dir(char **dirp_array)
{
    char *dir_name = "./";
    DIR *dp;
    struct dirent *dirp;
    if ((dp = opendir((const char *)dir_name)) == NULL){
        perr_exit("opendir errno");
    }
    while((dirp = readdir(dp)) != NULL){
        (*dirp_array) = (char *)dirp->d_name;
        printf("%s
"
,(* dirp_array++)); } dirp_array = NULL; closedir(dp); }

実行後、セグメントエラーが発生しました.
上のコードには次の問題があります.1.明らかに、ポインタ、2 Dが入っています.(dirp_array)=(char)dirp->d_name;この一言では,1つの関数内の一時メモリの内容のアドレスをこのポインタの指向アドレスとすることは不可能である.関数から飛び出してこの一時アドレスを指すと、2.dirp_array=NULL;この文は、dirp_arrayポインタにNULLを付与しようとし、このポインタを終了しようとした(文字列ポインタが終了したかどうかを判断するために使用し始めた).しかし、これは明らかに間違っている.これは、このパラメータにしか与えられない値であり、入力された値ではないからである.
はい、間違いを知っている以上、修正しましょう.
void list_dir(char **dirp_array)
{
    char *dir_name = "./";
    DIR *dp;
    struct dirent *dirp;
    if ((dp = opendir((const char *)dir_name)) == NULL){
        perr_exit("opendir errno");
    }
    while((dirp = readdir(dp)) != NULL){
        (* dirp_array) = strdup((char *)dirp->d_name);
        printf("%s
"
,(* dirp_array++)); } *dirp_array = NULL; closedir(dp); }

次に、list_に転送できるように2 D文字列ポインタを定義します.dir、必要なファイル名を保存させます.
char *dirp_array[256];

注意:文字列ポインタを使用する場合はchar**dirp_は使用できません.array;
では、ファイル名を格納した文字列ポインタで、ファイル名を読み取りたいと思います.ここでもう一つ説明しなければならないことがあります.dirp_arrayは現在、実際のメモリ領域がない配列ポインタなので、参照しながら適切なメモリ領域を割り当てる必要があります.そのため、strdup関数を使用して、空間を作成し、文字列をコピーしました.
次に、ファイル名情報が正常に保存されたかどうかを確認する関数を定義します.
void chack_array(char **array)
{
    while(array != NULL){
        printf("%s
"
,(* array++)); } }

この関数は、上記の第1版のlist_も持っています.dirの2番目のエラー.次のように変更します.
void chack_array(char **array)
{
    while(*array != NULL){
        printf("%s
"
,(* array++)); } }

ここで説明する問題の1つは、2 D文字列ポインタのメモリ割り当てに関する問題です.