C : link 列表中这两个声明的区别

C : Difference between these two declaration in link list

main()中的代码有两种类型的声明。第一个有效,第二个无效。

第一个代码有效并打印如下输出:

Set Duty Cycle 0 Set Frequency 1 Set Ore 2 Set Minuti 3

第二种情况只有returns这个字符串,即总是打印'Set Duty Cycle':

Set Duty Cycle 0 Set Duty Cycle 0

代码完成:

  #include <stdio.h>
  #include <stdlib.h>

  const char text[][16] = {"Set Duty Cycle",
                           "Set Frequency",
                           "Set Ore",
                           "Set Minuti",
                           "Set Current"
                        };



  //char lcd is an index. When you get the next node, it read 'lcd' and print the new string
  typedef struct node
  {
     char lcd;
     unsigned int value;
     struct node *next;
     struct node *prev;
  } NODE;


 
 void cursor(NODE **node)
  {
     printf(" %s  %d",text[(*node)->lcd],(*node)->lcd);     
     (*node) = (*node)->next;    
  }


  

   int main()
   {
     /* First case : it works as aspected   
     NODE **ptr;
     NODE* head     = &(NODE) {.lcd = 0, .next = NULL, .prev = NULL, .value = 0 };
     NODE* setDutyC = &(NODE) {.lcd = 1, .next = NULL, .prev = NULL, .value = 0 };
     NODE *setFreq  = &(NODE) {.lcd = 2, .next = NULL, .prev = NULL, .value = 0 };
     NODE *setOre   = &(NODE) {.lcd = 3, .next = NULL, .prev = NULL, .value = 0 };
     NODE *setMin   = &(NODE) {.lcd = 4, .next = NULL, .prev = NULL, .value = 0 };
     NODE *setCurr  = &(NODE) {.lcd = 5, .next = NULL, .prev = NULL, .value = 0 };

     setDutyC->next = setFreq;
     setFreq->prev  = NULL;
     setFreq->next  = setOre;
     setFreq->prev  = setDutyC;
     setOre->next   = setMin;
     setOre->prev   = setFreq;
     setMin->next   = setCurr;
     setMin->prev   = setOre;
     head->next     = setDutyC;
  */


     //-------- second case : it prints only "Set Duty Cycle" string  
     NODE **ptr;
     NODE *head;
     NODE *setDutyC;
     NODE *setFreq;
     NODE *setOre;
     NODE *setMin;
     NODE *setCurr;

     head     = &(NODE) {.lcd = 0, .next = setDutyC,.prev = NULL,    .value = 0 };
     setDutyC = &(NODE) {.lcd = 1, .next = setFreq, .prev = NULL,    .value = 0 };
     setFreq  = &(NODE) {.lcd = 2, .next = setOre,  .prev = setDutyC,.value = 0 };
     setOre   = &(NODE) {.lcd = 3, .next = setMin,  .prev = setFreq, .value = 0 };
     setMin   = &(NODE) {.lcd = 4, .next = setCurr, .prev = setOre,  .value = 0 };
     setCurr  = &(NODE) {.lcd = 5, .next = NULL,    .prev = setMin,  .value = 0 };
     //--------


     ptr= &head;
     cursor(ptr); 
     cursor(ptr); 
     cursor(ptr); 
     cursor(ptr); 
  }

好像“node->next”不起作用

 head     = &(NODE) {.lcd = 0, .next = setDutyC,.prev = NULL,    .value = 0 };
 setDutyC = &(NODE) {.lcd = 1, .next = setFreq, .prev = NULL,    .value = 0 };

在上面的第一行中,您使用尚未初始化的setDutyCsetFreqsetOresetMinsetCurr 也有同样的问题。这是错误的,会触发 未定义的行为

如果您打开编译器警告生成,您将收到一条警告消息。 始终解决所有警告。