C - 结构中的无符号字符

Posted

技术标签:

【中文标题】C - 结构中的无符号字符【英文标题】:C - unsigned char in a struct 【发布时间】:2015-01-24 19:38:22 【问题描述】:

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

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

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,当然应该如此。

我什至尝试像这样定义列表节点本身:

List* check = newList(b);
ListNode* d = check->head;
ListNode e = *d;
printf("%u\n", e.letter );

这基本上只是模仿我的功能,然后打印 98.

有人可以向我解释一下吗?困惑了很久。

【问题讨论】:

你需要显式分配一个ListNode的实例。您在 newList (s1) 中创建的那个被分配在堆栈上,并在您的函数返回时消失。这意味着:在返回时执行 s2,因此 new_list->head 变得无效。 【参考方案1】:

因为

ListNode s1 =  a, NULL ;

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

试试这个

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

new_list->head = s1;

一些提示:

    根据NULL 检查malloc 返回值 不要转换 malloc 的结果,它不需要。 使用完malloced 指针后,别忘了致电free()

【讨论】:

谢谢!有效!所以我也需要为结构内的结构分配内存? 是的,如果您需要通过指针访问它,在这种情况下您可以这样做。

以上是关于C - 结构中的无符号字符的主要内容,如果未能解决你的问题,请参考以下文章

C中的无符号字符未按预期工作

c_cpp 使用C ++中的无符号字符的示例

如何在c中的无符号字符中移动字节

如何将字节数据从套接字写入 C 中的无符号字符向量? [关闭]

C# 中的无符号字符使用哪种数据类型?

如何在c中读取由空格分隔的无符号字符