Я пытаюсь выучить немного C, и я начал с простой программы колоды карт.
Карта представляет собой структуру, содержащую два целых числа для лица и масти. И я собираю колоду, распределяя 52 карты и тщательно изучая все oop.
card *Deck = (card*)malloc(sizeof(card) * 52);
for(int i = 0; i < 4; i++){
for(int j = 1; j < 14; j++){
Deck->face = j;
Deck->suit = i;
Deck += sizeof(card);
}
}
Deck -= sizeof(card) * 52;
printDeck(Deck);
free(Deck);
. У меня есть функция printCard
, которая принимает один указатель и печатает значения, и печатная колода. функция, которая вызывает printCard
52 раза. Если я печатаю карточки по мере их создания, все идет хорошо, но если я печатаю карточки после того, как все они были созданы по какой-то причине, я получаю сегментную ошибку на 6-й карточке. Я запустил gdb
и заметил этот вывод:
Seven of Diamonds<br>
(null) of Diamonds<br>
Nine of Diamonds<br>
Остальная часть вывода нормальная. При проверке значения 6-й карты я получил:
(gdb) p c->face
$10 = 2675
Если я пропускаю 6-ю карту, вывод в порядке, и все работает так, как должно. Я новичок в C, но я не могу понять, как это значение было помещено в это поле в моем коде.
struct card{
int face;
int suit;
};
void printCard(card* c){
printf("%s of %s\n", face_str[c->face], suit_str[c->suit]);
}
Редактировать:
Код PrintDeck:
До:
void printDeck(card* c){
for(int i = 0; i < 52; i++){
printCard(c);
c += sizeof(card);
}
}
После:
void printDeck(card* c){
for(int i = 0; i < 52; i++){
printCard(c);
c++;
}
}
printCard не изменилось:
void printCard(card* c){
printf("%s of %s\n", face_str[c->face], suit_str[c->suit]);
}