Проблема с массивом в C - PullRequest
       1

Проблема с массивом в C

0 голосов
/ 30 августа 2011

Я очень смущен. В цикле while я добавляю каждое имя файла в массив и затем печатаю его.

Однако в цикле for он печатает некоторые странные вещи и останавливается в середине.

Пожалуйста, помогите мне исправить это.

char *commands[1000];

char *str;
DIR * dir;

struct dirent * entry;

char *env = getenv("PATH");

do {
    str = strsep(&env, ":");

    if(str != NULL)
        if(strlen(newEnv) > 0) {

            dir = opendir(str);
            if( dir == NULL ) break;

            flag = 0;
            while((entry = readdir(dir)) != NULL) {
                commands[++count] = entry->d_name;
                printf("---%i %s\n", count ,commands[count]);  // prints fine
            }
            closedir(dir); // close directory

        }

} while(newEnv);

commands[++count] = '\0';
printf("count = : %i\n", count);

for(int i = 0; i <  count; i ++)
{
    if(commands[i] == NULL)
        break;
    printf("aaa%i %s\n\n", i, commands[i]);  //problem loop
}

Ответы [ 4 ]

2 голосов
/ 30 августа 2011

commands[++count] = entry->d_name не копирует строку entry->d_name в commands[++count], а просто назначает указатель.На следующей итерации entry->d_name перезаписывается, поскольку readdir использует статическую память для возврата результата.

Используйте взамен strcpy и выделите память самостоятельно.

2 голосов
/ 30 августа 2011

Вы устанавливаете свои указатели, указывающие на структуру dir, полученную readdir.Однако эта структура освобождается closedir.

Вам необходимо скопировать строки (strdup и друзья).

0 голосов
/ 30 августа 2011

В дополнение к ответу Евгения Гомякова:

В последнем цикле не следует полагаться на массив «команд», который будет инициализирован значениями NULL.

0 голосов
/ 30 августа 2011

Проблемы:

  • Вы добавляете указатели в массив, которые указывают на строки, которые будут освобождены readdir/closedir вскоре после
  • , если начальное значение count0, commands[0] никогда не назначается и содержит мусор
  • строка commands[++count] = '\0'; кажется ошибкой, но, к счастью, она добавляет 1 к count, поэтому строка print count печатает правильное число иfor цикл повторяется в нужном диапазоне
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...