【发布时间】:2014-06-19 13:49:02
【问题描述】:
我有一个函数,它通过指针接收存储位置。这个地方可以有不同的其他类似结构。函数必须读取文件。该文件存储了一个结构,我需要阅读它。
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: ???
==2746== 地址 0x0 没有被堆栈、malloc 或(最近)释放
这是 "DEBUG_PRINT("User id: %d",holder.user_manage[i].user_id );" 的行所以显然看起来我没有将它存储在正确的位置。 你能帮帮我吗?
【问题讨论】:
-
不确定这是否是您的确切问题的原因,但在
memcpy( (struct user_manage_t *) &prt, &buffer, 90);中,您将 90 个字节复制到存储prt指针变量的位置,而不是它指向的位置。 -
我相信某事有道理,看起来大错特错。
-
sth 是对的,
memcpy必须破坏内存,除非您的指针大小恰好是 90 字节......也许考虑检查prt是否也有NULL指针? -
如果我错了请纠正我,但我认为我分配了 10x sizeof(user_manage_t) 有 12 个字节,所以总共 120 个字节
-
@EliasVanOotegem:按照您在 Stack Overflow 上看到的内容,这似乎是演员阵容最常见的用例;)