关于结构

时间:2017-03-26 08:04:22

标签: c struct

所以我有2个结构。 1是intStk,另一个是intStkNode。 intStk包含节点和头部中每个数组的大小,即最近创建的intStkNode。 intStkNode将包含一个tos int,它是它所在的索引,内容是intStk中包含的int大小的int数组,next是下一个Node的int。

因此,如果我有1个节点且大小为5,则头部将指向此节点,并且节点将具有0的tos,大小为5的数组全为空,并且接下来为-1。

如果有两个节点且大小为5,则新节点的tos为1,大小为5的数组,接下来为9. intStk头现在将指向tos为1的那个。

以下是我的代码到目前为止以及我的问题。

struct intStack {
    unsigned int allocatedSize;
    struct intStackNode * head;
};

struct intStackNode {
    unsigned int tos;
    int * contents;
    int next;
};

struct intStackNode *
makeNewNode(intStack * stk) {
    struct intStackNode * newNode = malloc(sizeof(struct intStackNode));
    int currentLocation = stk->head->tos;
    //this is not complete yet.
    return newNode;
}

intStack *
stkCreate(unsigned int size) {
    intStack * stk = malloc(sizeof(intStack));
    stk->allocatedSize = size;
    struct intStackNode * intStk = malloc(sizeof(struct intStackNode));
    intStk->tos = 0;
    stk->head = 0;
    int * intStk->contents[size];
    intStk->next = -1;

    return stk;
}

问题。

  1. int currentLocation = stk-> head-> tos的语法是什么?正确?这会在第一个例子中返回0,在第二个例子中返回1吗?

  2. stk-> head = 0的语法是什么?做我想做的事情?这是在创建阶段,因此每次都会指向tos为0的节点,但对我来说这似乎很奇怪。

  3. int * intStk-> contents [size];不管用。这是数组的大小取决于传递的内容。我收到了这个错误,对我来说没有意义。

    intstk-lc:33:14:错误:在' - >'标记属性' >

    int * intStk-> contents [size];

2 个答案:

答案 0 :(得分:1)

您的问题的答案,按照正确的顺序,没有立即修复,如下:

  

stk-> head = 0的语法是什么?做我想做的事情?这是在创建阶段,因此每次都会指向tos为0的节点,但对我来说这似乎很奇怪。

它将指针stk->head设置为空指针。它没有指向任何地方。这将我们带到下一个问题。

  

int currentLocation = stk-> head-> tos的语法是什么?正确?这会在第一个例子中返回0,在第二个例子中返回1吗?

由于stk->head在创建后立即是空指针,因此尝试取消引用它的tos字段会导致程序的行为未定义。

  

int * intStk-> contents [size];不管用。这是数组的大小取决于传递的内容。

不,不是。 contents的{​​{1}}字段是指针。您不能将其重新定义为数组,这不是您可以为此指针指向的数组分配空间的方式。整条线都是错误的。

除此之外,您的代码(不是那样)以不检查struct intStackNode的返回值的形式存在微妙的错误,并假设它总是会成功。

解决这两个问题:

  1. 您已经分配了malloc,因此设置struct intStackNode指向它:

    stk->head
  2. 如果您希望struct intStack * stk = malloc(sizeof *stk); if(stk == NULL) { // handle allocation error somehow. // return from function or abort program. // Do not just continue as if all is well. } stk->allocatedSize = size; stk->head = malloc(sizeof *(stk->head)); if (stk->head == NULL) { // another error to handle. Don'e leak resources. free(stk); // handle the error } 指向stk->head->contents - 完整的整数,您还需要分配它们:

    size

答案 1 :(得分:0)

这些是正式您问题的答案。我保证他们是正确的,我不能保证他们会以任何方式帮助你。

  

int currentLocation = stk-> head-> tos的语法是什么?正确?

  

这会在第一个例子中返回0,在第二个例子中返回1吗?

在整个程序至少在语法上正确之前,它根本无法返回任何内容。假设您只修复了语法错误,它在第一个示例中无法返回任何内容,因为列表中没有节点。头指针不指向任何节点;见下文。假设你修复了它,它不能在第二个例子中返回任何有两个节点的东西,因为它总是有一个节点。该程序从不链接两个或多个节点以形成链接列表。鉴于struct intStackNode的声明它不能这样做。

  

stk-> head = 0的语法是什么?做我想做的事情?这是在创建阶段,因此每次都会指向tos为0的节点,但对我来说这似乎很奇怪。

不,它不会指向tos为0的节点或任何其他节点。 0是一个特殊常量,使指针指向无效对象。通常它在C中拼写为NULL以避免混淆。

  

int * intStk-> contents [size];不管用。这是数组的大小取决于传递的内容。我收到了这个错误,对我来说没有意义。

语法不正确。要分配大小为size的整数数组,请执行以下操作:

 intStk->contents = malloc(size * sizeof(int));