【问题标题】:LinkedList Struct Typedef in CC中的LinkedList结构Typedef
【发布时间】:2013-09-02 23:53:39
【问题描述】:

我正在尝试在 C 中构建一个基本的链表。我似乎收到此代码的错误:

typedef struct
{
    char letter;
    int number;
    list_t *next;
}list_t;

char letters[] = {"ABCDEFGH"};

list_t openGame, ruyLopez;
openGame.letter = letters[4];
openGame.number = 4;
openGame.next = &ruyLopez;


ruyLopez.letter = letters[5];
ruyLopez.number = 4;
ruyLopez.next = NULL;

它不会接受我在结构中的定义:

list_t *next;

出于同样的原因,它不会接受:

openGame.next = &ruyLopez;

【问题讨论】:

  • 这与 Xcode 无关。至于实际问题:C不是C++。您必须使用 struct 关键字引用结构类型,直到其定义完成,即。 e. typedef struct list_t { ... struct list_t *next; }。但这已经被问到并在这里回答了大约。 1038462475928745 次。
  • 哦,_t 类型保留用于 POSIX,污染“命名空间”会导致未定义的行为。
  • @H2CO3 Referral Question/Answer 关于_t 后缀类型名称的观点。
  • @WhozCraig 不错,谢谢!
  • Declaration rule in struct typedef 的可能重复项。我怀疑还有其他潜在的重复——甚至可能更好。

标签: c data-structures


【解决方案1】:

当您在代码中使用list_t *next 时,编译器不知道如何处理list_t,因为您还没有声明它。试试这个:

typedef struct list {
    char letter;
    int number;
    struct list *next;
} list;

正如 H2CO3 在 cmets 中指出的那样,使用 _t 作为标识符后缀不是一个好主意,所以不要使用 list_t。

【讨论】:

  • 第三行应该是 struct list *next 根据您的代码。否则我们可以做下面的.typedef struct list list;结构列表 { 字符字母;整数;列出*下一个; };
  • 这个命名技巧解决了许多微妙的自引用问题。 +1
【解决方案2】:

为什么你把openGame和ruzeLopez设置为指针,而你不必使用&(这是使用链表的常用方法,只是不要忘记使用->访问会员)

试试这个代码:

#include <stdlib.h>
#include <malloc.h>

typedef struct list
{
    char letter;
    int number;
    struct list *next;
}list;

main(void)
{
   char letters[] = "ABCDEFGH"; //what were the braces for ?
   list *openGame, *ruyLopez;
   openGame = ruyLopez = NULL;
   openGame = malloc(sizeof(list));
   ruyLopez = malloc(sizeof(list));

   openGame->letter = letters[4];
   openGame->number = 4;
   openGame->next = ruyLopez;

   ruyLopez->letter = letters[5];
   ruyLopez->number = 5;
   ruyLopez->next = NULL;
}

【讨论】:

    【解决方案3】:

    这是一个没有因使用 malloc 创建结构而导致内存泄漏风险的工作示例。

    #include <stdlib.h>
    
    typedef struct _list
    {
        char letter;
        int number;
        struct _list *next;
    } list_type;
    
    int main(void)
    {
       char letters[] = "ABCDEFGH"; //what were the braces for ?
       list_type openGame, ruyLopez;
       openGame.letter = letters[4];
       openGame.number = 4;
       openGame.next = &ruyLopez;
    
       ruyLopez.letter = letters[5];
       ruyLopez.number = 5;
       ruyLopez.next = NULL;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多