在我的代码中,我有一个类User的Array作为UserManager类中的私有变量。当调用UserManager :: Shutdown()时,它将用户数组保存到文件中。但是我收到了访问冲突错误。 fwrite.c中发生访问冲突错误
我正在运行Windows 7的Visual Studio 2010上进行编译。
用户类
class User {
public:
User() {
memset(username, 0, 255);
memset(password, 0, 255);
}
int userId;
char username[255];
char password[255];
};
MAX_USERS定义
#define MAX_USERS 2048
用户管理器构造函数
UserManager::UserManager() {
memset( users, 0, MAX_USERS);
}
关机功能
void UserManager::Shutdown( void) {
FILE *userDB = fopen( "users.bin", "wb");
int k=1;
for(k=1;k<MAX_USERS-1;k++){
if (users[k]!=NULL) {
fwrite((const void*)&users[k]->userId, sizeof(int), 1, userDB);
fwrite((const void*)users[k]->username, 255, 1, userDB);
fwrite((const void*)users[k]->password, 255, 1, userDB);
} else {
fpos_t skip = 255 + 255 + sizeof(int);
fsetpos( userDB, &skip);
}
}
fclose( userDB);
}
数组'users'在构造函数中的memset为零。
答案 0 :(得分:1)
你的循环迭代从1开始,但数组索引从0开始。没有看到MAX_USERS的定义或实际错误,我的猜测是你的k值超出你的用户数组边界。
您已将用户声明为
User *users[MAX_USERS] = {};
然后,在创建每个用户时,您没有新用户。所以,而不是
users[index] = new User();
你做了
User user1;
users[index] = &user1;
第二个版本可能超出范围。然后,user1
的内存将重新分配到其他位置,当您尝试通过users[k]->
访问它时,您将获得访问冲突。
下面是我用来尝试找出问题的代码。我填补空白时很快又脏,但它完成了。希望它会有所帮助。
#define MAX_USERS 2048
class User {
public: User() {
memset(username, 0, 255);
memset(password, 0, 255); }
int userId;
char username[255];
char password[255];
};
void writefile( User **users)
{
FILE *userDB = fopen( "users.bin", "wb");
int k=0; for(k=0;k<MAX_USERS-1;k++){
if (users[k]!=NULL) {
fwrite((const void*)&users[k]->userId, sizeof(int), 1, userDB);
fwrite((const void*)users[k]->username, 255, 1, userDB);
fwrite((const void*)users[k]->password, 255, 1, userDB);
fprintf(stdout, "UserID %d\n", users[k]->userId);
fprintf(stdout, "%s\n", users[k]->username);
fprintf(stdout, "%s\n", users[k]->password);
fflush(stdout);
} else {
fpos_t skip = 255 + 255 + sizeof(int);
fsetpos( userDB, &skip);
}
} fclose( userDB);
}
int _tmain(int argc, _TCHAR* argv[])
{
User *users[MAX_USERS] = {};
memset(users, 0, MAX_USERS);
users[0] = new User();
users[0]->userId = 1;
memcpy(users[0]->username,"BLah", strlen("BLah"));
memcpy(users[0]->password,"something:", strlen("something:"));
users[2] = new User();
users[2]->userId = 1;
memcpy(users[2]->username,"BLah2", strlen("BLah2"));
memcpy(users[2]->password,"something:", strlen("something:"));
writefile(users);
return 0;
}
答案 1 :(得分:0)
您是否正在初始化所有变量?
怀疑是阵列是原因。