【发布时间】:2014-05-25 02:49:45
【问题描述】:
假设我有这个struct:
struct card{
char num;
char suit;
};
还有这个结构指针数组:
struct card *deck[52];
然后这个方法初始化一副纸牌(这是用于设备驱动器,因此是 kmalloc):
static int __init_deck(void){
// allocate some memory
int i;
for(i = 0; i < 52; i++){
deck[i] = kmalloc(sizeof(struct card), GFP_KERNEL);
if(!deck[i]){
printk(KERN_ERR "Unable to allocate memory.");
}
}
returnValue = misc_register(&deck_dev);
if(returnValue){
printk(KERN_ERR "Unable to register\n");
}
// give the card structs some values in the deck.
// Spades
for(i = 0; i < 13; i++){
// why does this not work??
*(deck[i].num) = (char)i;
*(deck[i].suit) = 'S';
}
// Hearts
for(i = 13; i < 16; i++){
deck[i].num = (char)i;
deck[i].suit = 'H';
}
// Diamonds
for(i = 26; i < 39; i++){
deck[i].num = (char)i;
deckk[i].suit = 'D';
}
// Clubs
for(i = 39; i < 52; i++){
deck[i].num = (char)i;
deck[i].suit = 'C';
}
return returnValue;
}
我声明了一个大小为 52 的数组,其中包含指向 struct card 的指针。我试图明显地尊重包含在数组中某个位置的结构,以便我可以向该结构添加“东西”。为什么我在一个案例中的取消引用不起作用?
【问题讨论】:
-
除了黑桃循环,将
deck[i].num替换为deck[i]->num,将deck[i].suit替换为deck[i]->suit -
另外,
for(i = 13; i < 16; i++){可能应该是26而不是16。也许num应该是mod 13。 -
出于好奇,这有什么关系?他们不是都完成了同样的事情吗?
-
我不得不问,为什么您的内核设备驱动程序中有一副卡片 - 更不用说 52 个单独 malloc 的卡片了?
-
有了
// Hearts和for(i = 13; i < 16; i++){的红心将很难取胜。当然,你可以更好地使用一组字符作为西装和一个双循环,而不是将几乎相同的循环写出 4 次。
标签: c arrays struct dereference