二维字符串指针

解决问题:使用指针,灵活控制指针关系。
例子讲述:将当前目录下的文件名导出。

参考博文:
1. 二维字符数组与char** 关系
2. C语言中二维字符数组的定义和初始化
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\n",(* dirp_array++));
    }
    dirp_array = NULL;
    closedir(dp);
}

运行后,出现段错误。

上面的代码有如下问题:
1. 显然,传入的是一个指针,二维的。而(dirp_array) = (char )dirp->d_name;这一句,想将一个函数体内临时内存的内容的地址作为这个指针的指向地址,这根本不可能。一旦跳出该函数,指向的这个临时地址,就已经是无权访问了(更准确是:根本不会存在)
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\n",(* dirp_array++));
    }
    *dirp_array = NULL;
    closedir(dp);
}

然后,我还想要的是:
定义一个二维字符串指针,这样我就可以传入给list_dir,让它来存储我需要的文件名。

char *dirp_array[256];

注意:如果要使用字符串指针,那就不能使用char **dirp_array;

好了,现在我还想通过我已经存储了文件名的字符串指针,来读取文件名。在这里还需要说明一件事情:dirp_array目前是一个数组指针,它没有实际的内存空间,所以在引用它的同时需要给它分配切当的内存空间,所以,在上面,我已经使用了strdup函数,创建空间并复制字符串。

现在,尝试定义一个函数:来检验我们是否已经成功保存了文件名信息。

void chack_array(char **array)
{
    while(array != NULL){
        printf("%s\n",(* array++));
    }
}

该函数同样具有上面第一版的list_dir的第二个错误。
更改如下:

void chack_array(char **array)
{
    while(*array != NULL){
        printf("%s\n",(* array++));
    }
}

这里需要引申的一个问题:
关于二维字符串指针的内存分配问题

你可能感兴趣的:(C/C++)