我使用以下结构类型定义并根据内存分配:
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));
...
在我的程序结束时,我最终遇到了访问冲突,并且我想知道这种奇怪的类型定义是否与它有关。 我称之为奇怪的事情:
(struct company*)malloc(sizeof(company));
会出现什么问题,但不允许使用&#34;不完整类型&#34;错误(顺便说一下,这里是不完整的?)?)答案 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
本身已经指向已分配的空间!发布的代码不是这种情况。