Для этих структурных определений я инициализирую их все, а затем распечатаю их содержимое с помощью printstruct(); но после печати первого элемента программа неожиданно зависает,
1. Я думал, что если malloc() не удалось, это будет для всех элементов правильно ?.
2.I, к сожалению, приходится работать с этими структурами, любые идеи не в порядке с кодом ниже?
Примечание: Все символьные массивы имеют размеры, равные максимальной длиной содержания они получат плюс один для нулевого завершающего символа «\ 0», каждая команда имеет максимум 7 игроков, количество команд 21000.
Извините за этот вопрос проверки ошибок, но я никогда не работал с структурами на C++ в прошлом.Печать массива структур structs приводит к непредвиденной ошибке выполнения?
typedef struct Player{
char firstName[50];
char lastName[50];
}Player;
typedef struct Team{
int id;
char title[50];
char summary[100];
int numberOfPlayers;
Player *players;
}Team;
typedef struct TeamsLog{
Team *arr;
int numberOfTeams;
}Teams;
int main()
{
TeamsLog log;
log.numberOfTeams = 21000;
log.arr = (Team*)malloc(log.numberOfTeams * sizeof(Team));
for (int i = 0; i < log.numberOfTeams; ++i)
{
(log.arr+ i)->id = 1;
(log.arr + i)->numberOfPlayers = 7;
for (int l = 0; l < 10; ++l)
{
(log.arr + i)->summary[l] = '0' + l;
(log.arr + i)->title[l] = '0' + l;
}
(log.arr + i)->summary[10] = '\0';
(log.arr + i)->title[10] = '\0';
log.arr->players = (Player*)malloc(7 * sizeof(Player*));
for (int l = 0; l < 7; ++l)
{
for (int k = 0; k < 10; ++k){
(log.arr + i)->players[l].firstName[k] = '0' + k;
(log.arr + i)->players[l].lastName[k] = '0' + k;
}
(log.arr + i)->players[l].firstName[10] = '\0';
(log.arr + i)->players[l].lastName[10] = '\0';
}
printstruct(log.arr + i);
}
}
Код printstruct():
void printstruct(Team* arg)
{
cout << "\nTeam Name: " << arg->title
<< "\nId: " << arg->id
<< "\nSummary: " << arg->summary
<< "\nNumber of players: " << arg->numberOfPlayers << endl;
for (int j = 0; j < arg->numberOfPlayers; ++j)
cout << "Player " << j+1 << " " << ((arg->players) + j)->firstName << " "
<< ((arg->players) + j)->lastName << endl;
}
«Все символьные массивы имеют размеры, равные максимальной длиной содержания они будут получать» ... + 1 для завершающего '\ 0' ? –
@Paul Roub Включая '\ 0' Я отредактирую благодарность за указание – hitter
'sizeof (Player *)' должен быть 'sizeof (Player)'. И используйте 'std :: string' и' std :: vector' insead этой ошибки, подверженной ошибкам, жонглируя указателем (или переключитесь на C, если вам нравится такая вещь). –