簡體   English   中英

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 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()函數的堆棧框架中,並且當該函數返回時,它不再存在,但是在結構中有指向它的指針。

嘗試這個

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

new_list->head = s1;

一些技巧:

  1. 檢查malloc返回值是否為NULL
  2. 不要轉換不需要的malloc結果。
  3. 每當您使用完malloc ed指針時,不要忘記調用free()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM