2016-10-12 5 views
-3

В процессе отладки этой процедуры я обнаружил, что двумерный объект цели не может добавить 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 ++; 
     //dirp_array += strlen(*dirp_array); 
    } 
    *dirp_array = NULL; 
    closedir(dp); 
} 

после изменения, я хочу получить двумерную информацию, которую я определил. Итак, я определяю функцию здесь.

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

main(){ 
    char *dirp_array[256]; 
    list_dir(dirp_array); 
    chack_array(dirp_array); 
} 

но я дампа памяти

+0

пока я не могу получить флаги NULL, я имею в виду, что я не могу остановиться. – haochenghhc

+2

Вы должны указать, какой язык вы используете, и сделать код более читаемым. – Nurjan

+0

ОК, я знаю, я должен изменить ** while (array! = NULL) ** для ** while (* array! = NULL) ** – haochenghhc

ответ

1

Эта строка:

dirp_array = NULL; 

Должно быть

*dirp_array = NULL; 

Ваша первая версия не изменяет содержимое массива, предоставленной абоненту. Он просто говорит, что указатель dirp_array теперь NULL, т.е. не указывает на какой-либо массив. Вы хотите сохранить NULL в элемент в массиве вызывающего, и вы делаете это по 2-й версии выше, разыменовывая указатель.

+0

после изменения, я хочу получить двумерную, которую я определил. ** – haochenghhc

+0

** недействительным chack_array (символ ** массив) { \t в то время как (массив! = NULL) { \t \t Е ("% s \ п", (* массив)); \t \t массив ++; \t}} ** и в основных() ** символ * dirp_array [256]; \t list_dir (dirp_array); \t chack_array (dirp_array); ** , но у этого есть core dump. – haochenghhc

+0

@haochenghhc обратите внимание, что ваш 'dirp_array' не является двумерным массивом. это массив указателей (которые указывают на указатели на символ). Вы также можете иметь двумерный массив символов, что было бы совсем иначе, даже если вы можете индексировать его с помощью синтаксиса 'foo [row] [column]'. С-массивы и указатели, и особенно их смешивание, являются довольно сложным предметом, и передача массивов в функции еще сложнее. – hyde

Смежные вопросы