这种双重类型定义是否会导致访问冲突?

时间:2017-01-25 09:44:55

标签: c struct types typedef

我使用以下结构类型定义并根据内存分配:

typedef struct company_tag { struct company_tag *next;
                             <some other elements of the structure>
                           } company;

...
static company *freecompany;
company *ps;
ps = (company*)&freecompany;
ps->next = (struct company_tag*)malloc(sizeof(company));
...

在我的程序结束时,我最终遇到了访问冲突,并且我想知道这种奇怪的类型定义是否与它有关。 我称之为奇怪的事情:

  • 为什么有两种类型的定义(company_tag和company),它们之间是否有任何联系/区别?
  • 为什么在分配行中使用这两种类型定义? ((struct company*)malloc(sizeof(company));会出现什么问题,但不允许使用&#34;不完整类型&#34;错误(顺便说一下,这里是不完整的?)?)

3 个答案:

答案 0 :(得分:3)

  

最终导致访问冲突

因为您尚未为ps分配内存并尝试访问ps->next

您需要在访问之前分配内存。 可能是您想要的是您的代码中所需的更改:

static company freecompany;  //declare variable 
company *ps;
ps = &freecompany;
  

为什么有两种类型的定义(company_tag和company)   他们之间的任何联系/区别?

没有区别,typedef可用于提供类型,新名称。

答案 1 :(得分:1)

  

为什么有两种类型定义(company_tag和company),它们之间是否存在链接/差异?

这是typedef

的整个想法
typedef struct company_tag { struct company_tag *next;
                         <some other elements of the structure>
                       } company;

您现在可以使用company代替完整格式struct company_tag - 这不是问题。

  

为什么在分配行中使用这两种类型定义? ((struct company *)malloc(sizeof(company));

会出现什么问题
ps->next = (struct company_tag*)malloc(sizeof(company));

实际上这条线可以(应该)写成:

ps->next = malloc(sizeof(company));

问题似乎在于以下几点:

static company *freecompany;
company *ps;
ps = (company*)&freecompany;

也许您不应该使用指针,这意味着:

static company freecompany;
company *ps = &freecompany;

答案 2 :(得分:0)

static company *freecompany;
company *ps;
ps = (company*)&freecompany;

这段代码是无意义的,不正确的,你永远不会在任何地方分配company对象而且演员是错误的。甚至很难猜到这段代码应该做什么,为什么会有一个静态指针变量?

  

为什么有两种类型定义(company_tag和company),它们之间是否存在链接/差异?

这样你就可以在同一个结构中声明一个指向同一类型结构的指针。所以struct company_tag *next;company* next;意味着完全相同。它只需要在struct声明中以前一种方式编写,因为在输入该行时仍然会声明结构,此时编译器不知道company是什么。

  

为什么在分配行中使用这两种类型定义?

因为编写此代码的人感到困惑。应该是

ps->next = malloc(sizeof(company));

但是假设ps本身已经指向已分配的空间!发布的代码不是这种情况。