C - 结构中的无符号字符
C - unsigned char in a struct
有人可以向我解释一下我在输出中得到不同结果的原因吗?
我已经使用列表节点定义了一个列表:
typedef struct list_node
{
unsigned char letter;
struct list_node *next;
} ListNode;
typedef struct list
{
ListNode *head;
} List;
以及用于新列表和 getData 的这些函数:
List* newList(unsigned char a) {
List* new_list = (List*)malloc(sizeof(List));
ListNode s1 = { a, NULL };
ListNode* s2 = &s1;
new_list->head = s2;
return new_list;
}
unsigned char getData(List *list){
ListNode *tmp = list->head;
ListNode d = *tmp;
return d.letter;
}
但是,当我尝试测试它并使用我的 getData 函数打印 unsigned char 时,我得到了一个奇怪的结果:
unsigned char b = 'b';
List* check = newList(b);
unsigned char lettercheck = getData(check);
printf("%u\n",lettercheck);
这会打印出值 204,
但是当我使用 printf("%u\n", b);
它当然会打印 98。
我什至试过这样定义 listnode 本身:
List* check = newList(b);
ListNode* d = check->head;
ListNode e = *d;
printf("%u\n", e.letter );
这基本上只是模仿我的函数所做的,然后打印出来
98.
有人可以给我解释一下吗?困惑了好久
因为
ListNode s1 = { a, NULL };
是一个局部变量,它存在于 newList()
函数的堆栈帧中,当函数 returns 它不再存在时,但你有一个指向它的指针结构。
试试这个
ListNode *s1 = malloc(sizeof(ListNode));
if (s1 == NULL)
handleThisErrorAndDoNotContinuePlease();
s1->letter = a;
s1->next = NULL;
new_list->head = s1;
一些小技巧:
- 对照
NULL
检查 malloc
return 值
- 不要转换
malloc
不需要的结果。
- 不要忘记在使用完
malloc
ed 指针时调用 free()
。
有人可以向我解释一下我在输出中得到不同结果的原因吗?
我已经使用列表节点定义了一个列表:
typedef struct list_node
{
unsigned char letter;
struct list_node *next;
} ListNode;
typedef struct list
{
ListNode *head;
} List;
以及用于新列表和 getData 的这些函数:
List* newList(unsigned char a) {
List* new_list = (List*)malloc(sizeof(List));
ListNode s1 = { a, NULL };
ListNode* s2 = &s1;
new_list->head = s2;
return new_list;
}
unsigned char getData(List *list){
ListNode *tmp = list->head;
ListNode d = *tmp;
return d.letter;
}
但是,当我尝试测试它并使用我的 getData 函数打印 unsigned char 时,我得到了一个奇怪的结果:
unsigned char b = 'b';
List* check = newList(b);
unsigned char lettercheck = getData(check);
printf("%u\n",lettercheck);
这会打印出值 204,
但是当我使用 printf("%u\n", b);
它当然会打印 98。
我什至试过这样定义 listnode 本身:
List* check = newList(b);
ListNode* d = check->head;
ListNode e = *d;
printf("%u\n", e.letter );
这基本上只是模仿我的函数所做的,然后打印出来 98.
有人可以给我解释一下吗?困惑了好久
因为
ListNode s1 = { a, NULL };
是一个局部变量,它存在于 newList()
函数的堆栈帧中,当函数 returns 它不再存在时,但你有一个指向它的指针结构。
试试这个
ListNode *s1 = malloc(sizeof(ListNode));
if (s1 == NULL)
handleThisErrorAndDoNotContinuePlease();
s1->letter = a;
s1->next = NULL;
new_list->head = s1;
一些小技巧:
- 对照
NULL
检查 - 不要转换
malloc
不需要的结果。 - 不要忘记在使用完
malloc
ed 指针时调用free()
。
malloc
return 值