Почему 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 и не требует переносимости.