Имам две функции open_files
и read_bytes
. Когато извикам само open_files
, всичко работи както трябва, но ако извикам read_bytes
след това, получавам грешка в сегментирането в open_files
. Използвам gcc като компилатор.
open_files
е функция, която търси в директория и попълва структура, съдържаща името на файла и дължината на масива от символи.
read_bytes
е функция без код и връща само 1.
Структурата за имена на файлове
struct file_name{
char * name;
int length;
};
Основната функция:
int main(int argc, char **argv){
struct file_name ** files;
int file_length;
unsigned char * hex;
long int bytesLength;
printf("CRAP");
getchar();
//Function open_files works if read_bytes function is not called....
if(open_files(files, &file_length) >= 0){
printf("CRAP2");
getchar();
if (read_bytes(hex, &bytesLength, files[0]->name) >= 0){
for(int i = 0; i < bytesLength; ++i){
printf("%X\n",hex[i]);
}
}
}
else{
printf("Something went wrong");
}
printf("%s\n", "Helluuuuuu");
free_memory(files, file_length);
return 0;
}
Функцията open_files
създава структура file_name за всеки файл в директория.
int open_files(struct file_name ** files, unsigned int * length){
DIR * dir;
struct dirent * ent;
int count = 0;
if((dir = opendir("TestFiles")) != NULL){
while((ent = readdir(dir)) != NULL ){
++count;
}
count -= 2;
closedir(dir);
}
else{
//Couldn't open directory
perror("");
return -1;
}
printf("working");
getchar();
//Allocate memory
*files = malloc(count * sizeof(struct file_name *));
printf("not working");
getchar();
*length = count;
if((dir = opendir("TestFiles")) != NULL){
count = 0;
while((ent = readdir(dir)) != NULL ){
if(strcmp(ent->d_name,".") != 0 && strcmp(ent->d_name,"..") != 0){
struct file_name * file = malloc(sizeof(struct file_name));
file->name = malloc(strlen(ent->d_name));
strcpy(file->name,ent->d_name);
file->length = strlen(ent->d_name);
files[count] = file;
++count;
}
}
closedir(dir);
}
else{
//Couldn't open directory
perror("");
return -1;
}
return 0;
}
read_bytes
е празна функция, която връща 1:
int read_bytes(unsigned char * hex, long int * length, char * file){
//FILE * fp;
//*length = file_size(file);
//printf("%li\n",*length );
//fp = fopen("TestFiles/first.jpg", "r");
//fread(hex, 1, *length, fp);
//fclose(fp);
return 1;
}
file->name = malloc(strlen(ent->d_name));
--›file->name = malloc(strlen(ent->d_name)+1);
(+1) Може би и други проблеми. - person chux - Reinstate Monica   schedule 31.05.2016open_files()
неинициализиран указател към указател отmain()
(files
), след което се опитвате да зададете към какво сочи, за да сочи към новоразпределен блок памет. Това може да причини нарушение на достъпа и ако не беше, показалецът все още нямаше да е наличен вmain()
. (подсказка: предайте адреса на указател отmain()
, вместо стойността на (неинициализиран) указател към указател) - person Dmitri   schedule 31.05.2016read_bytes()
за първия запис, без да проверявате броя на върнатите записиopen_files()
(какво се случва с празна директория, къдетоopen_files()
успява, но с 0 имена на файлове?)... и не се справяте със случая, когато се създават нови файлове в директорията между вашияopendir()
за получаване на броя иopendir()
за четене на имената на файловете... - person Dmitri   schedule 31.05.2016