【问题标题】:How to dereference from an array of struct poiners如何从结构指针数组中取消引用
【发布时间】: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]-&gt;num,将deck[i].suit替换为deck[i]-&gt;suit
  • 另外,for(i = 13; i &lt; 16; i++){ 可能应该是 26 而不是 16。也许num 应该是mod 13
  • 出于好奇,这有什么关系?他们不是都完成了同样的事情吗?
  • 我不得不问,为什么您的内核设备驱动程序中有一副卡片 - 更不用说 52 个单独 malloc 的卡片了?
  • 有了// Heartsfor(i = 13; i &lt; 16; i++){ 的红心将很难取胜。当然,你可以更好地使用一组字符作为西装和一个双循环,而不是将几乎相同的循环写出 4 次。

标签: c arrays struct dereference


【解决方案1】:

你在这里解引用不正确,*(deck[i].num) = (char)i;

首先你必须取消引用指针然后你访问它的成员。

 (*deck[i]).num = (char)i;

或使用-&gt; 运算符:

 deck[i]->num = (char)i;

【讨论】:

  • 啊,把星号放在括号的错误一边,但这是有道理的。谢谢!
  • @user3268401 因为你刚才遇到的问题 -> (结构箭头运算符)被构建了。所以你可以在不使用点运算符的情况下轻松访问.....:)
猜你喜欢
  • 1970-01-01
  • 2011-02-04
  • 2013-01-04
  • 1970-01-01
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
相关资源
最近更新 更多