C - 结构中的unsigned char

时间:2015-01-24 19:38:22

标签: c struct unsigned-char

有人可以向我解释一下我在输出中得到不同结果的原因吗?

我使用列表节点定义了一个列表:

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。

有人可以向我解释一下吗?我已经困惑了很长一段时间。

1 个答案:

答案 0 :(得分:2)

由于

ListNode s1 = { a, NULL };

是一个局部变量,它存在于newList()函数的堆栈框架内,当函数返回时它不再存在,但是你的结构中有一个指向它的指针。

试试这个

ListNode *s1 = malloc(sizeof(ListNode));
if (s1 == NULL)
    handleThisErrorAndDoNotContinuePlease();
s1->letter = a;
s1->next   = NULL;

new_list->head = s1;

一些提示:

  1. 针对malloc
  2. 检查NULL返回值
  3. 不要投出malloc不需要的结果。
  4. 每当您使用free()指针时,请不要忘记致电malloc