Почему nftw(3) работает со строковым литералом, но не с const char *

У меня есть следующие функции:

files.c

      int b_cb( const char *fpath, const struct stat *sb, int typeflag, struct FTW *ftwbuf ) {
  printf( "Here\n" );
  build_cb( fpath );
  return 0;
}

int dobuild( const  char *path, void ( *fn ) ( const char * path ) ) {
  printf( "%s\n", path );
  build_cb = fn;
  return nftw( path, b_cb, 64, FTW_DEPTH | FTW_PHYS );

}

main.c

      void build_action( const char *f ) {
    printf( "%s\n", f );
}

Я ожидаю, что когда я позвоню int dobuild( const char *path, void ( *fn ) ( const char * path ) ) с веревкой и void build_action( const char *f )функция в качестве аргумента будет печатать имена всех файлов в указанном дереве каталогов. Это сработает, если я назову это так:

      dobuild( "directory", buildaction );

но если я назову это так:

      char *dir = "directory";
dobuild( dir, buildaction );

Тогда ни один из обратных вызовов не будет вызван. Вызывается printf in, но ни один из остальных. Я знаю, что строка содержит тот же текст, что и я записываю в начале dobuild и каталог существует с файлами в.

Я совершенно не понимаю, почему использование строкового литерала здесь работает, а использование массива char - нет.

Я также попытался изменить буфер на const char * и получите такой же не рабочий результат.

Как я могу заставить эту работу работать с символом `` char * '', поскольку каталог не может быть исправлен?

Также этот код предназначен для работы только в Linux и не требует переносимости.

0 ответов

Другие вопросы по тегам