C:链接列表中这两个声明之间的区别

Posted

技术标签:

【中文标题】C:链接列表中这两个声明之间的区别【英文标题】:C : Difference between these two declaration in link list 【发布时间】:2021-09-10 00:11:17 【问题描述】:

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

第一个代码工作并打印输出如下:

设置占空比 0 设置频率 1 设置矿石 2 设置 Minuti 3

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

设置占空比 0 设置占空比 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”不起作用

【问题讨论】:

【参考方案1】:
 head     = &(NODE) .lcd = 0, .next = setDutyC,.prev = NULL,    .value = 0 ;
 setDutyC = &(NODE) .lcd = 1, .next = setFreq, .prev = NULL,    .value = 0 ;

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

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

【讨论】:

以上是关于C:链接列表中这两个声明之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

控制台 (/SUBSYSTEM:CONSOLE) 和 Windows (/SUBSYSTEM:WINDOWS) 之间的区别

将数组和数组指针传递给C中的函数之间的区别

如何找到两个字典列表之间的区别?

C ++中这两种强制转换方法有啥区别? [复制]

PyQt 中这两个 clicked() 信号有啥区别?

连接两个列表 - '+=' 和 extend() 之间的区别