У меня есть функция, которая получает указатель на место, где будет храниться. Это место может иметь другие подобные структуры. Функция должна прочитать файл. В этом файле хранится структура, которую мне нужно прочитать.
typedef struct user_manage_t{
short int user_id;
char permission;
long int other_id;
long int check;
}user_manage_t;
typedef struct holder_t{
user_manage_t *user_manage;
user_manage_t *user_manage_backup;
//(...)and a lot of stuff
}holder_t;
holder_t holder;
int db_read_from_file(user_manage_t *prt){
DEBUG_PRINT("READ_FROM file started");
FILE *fd_read;
char buffer[480];
int read, bytesRead=0;
int num;
const struct user_manage_t *header;
fd_read = fopen("/home/user/user_list","r+b");
if (fd_read == NULL)
{
printf("Error");
}
else
{
DEBUG_PRINT("Its open!!!");
}
do
{
read=fread(buffer, 2, 90, fd_read);
bytesRead=bytesRead+read;
DEBUG_PRINT("Number of bytes lidos read=%d",bytesRead);
}while(read!=0); //(bytesRead < 480);
header = (struct user_manage_t *) (buffer);
fclose(fd_read);
if ( NULL == ( prt = calloc( 10, sizeof(user_manage_t))))//aloca
{
DEBUG_PRINT("MAJOR_ERROR: couldnt allocate mem to users");
return -1;
}
else
{
memcpy( (struct user_manage_t *) &prt, &buffer, 90);
DEBUG_PRINT("Users copied to main list");
for ( short int i=0;i<4 ; i++ )
{
DEBUG_PRINT("i= %hd",i);
DEBUG_PRINT("User id: %d",holder.user_manage[i].user_id );
DEBUG_PRINT("Permission: %d",holder.user_manage[i].permission);
DEBUG_PRINT("other_ID:%ld",holder.user_manage[i].other_id);
DEBUG_PRINT("Check_value:%ld", holder.user_manage[i].check);
}
return 1;
}
}
main(){
db_read_from_file((struct user_manage_t *) &holer.user_manage);
db_read_from_file((struct user_manage_t *) &holder.user_manage_backup);
}
Когда я запускаю код, я получаю SEGFAULT, и valgrind сообщает мне об этом:
Тема 2:
==2746== Неверное чтение размера 2
==2746== по адресу 0x80523B4: db_read_from_file (code.c:3069)
==2746== по адресу 0x20303333: ???< br> == 2746 == Адрес 0x0 не стек, malloc или (недавно) освобожден
Это строка "DEBUG_PRINT("Идентификатор пользователя: %d",holder.user_manage[i].user_id);" Очевидно, что я храню его не в том месте. Вы можете мне помочь?
memcpy( (struct user_manage_t *) &prt, &buffer, 90);
вы копируете 90 байтов в место, где хранится переменная-указательprt
, а не в то место, на которое она указывает. - person sth   schedule 19.06.2014memcpy
должно портить память, если только ваши указатели не имеют размер 90 байт... и, возможно, также рассмотреть возможность проверкиprt
на наличиеNULL
указателей? - person Elias Van Ootegem   schedule 19.06.2014&prt
означает адресprt
,prt
уже является указателем, поэтому вы передаете указатель на указатель наmemcpy
, поэтомуmemcpy
перезапишет все, на что указывает этот указатель на указатель, и он указывает на указатель, который содержит адрес памяти фактической структуры. Этот адрес памяти - это то, что вы перезаписываете. И еще немного памяти, даже! - person Elias Van Ootegem   schedule 19.06.2014