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 };
在上面的第一行中,您使用尚未初始化的setDutyC
。 setFreq
、setOre
、setMin
和 setCurr
也有同样的问题。这是错误的,会触发 未定义的行为。
如果您打开编译器警告生成,您将收到一条警告消息。 始终解决所有警告。
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 };
在上面的第一行中,您使用尚未初始化的setDutyC
。 setFreq
、setOre
、setMin
和 setCurr
也有同样的问题。这是错误的,会触发 未定义的行为。
如果您打开编译器警告生成,您将收到一条警告消息。 始终解决所有警告。