Closed. This question is off-topic。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
                        
                        2年前关闭。
                                                                                            
                
        
所以我有2个结构。 1是intStk,另一个是intStkNode。 intStk包含节点和头中每个数组的大小,即最近创建的intStkNode。 intStkNode将包含一个tos int(即它所在的索引),内容(一个intStk中包含的大小为int的整数数组)和一个next(它是下一个下一个Node的int)。

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

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

到目前为止,这是我的代码,下面是我的问题。

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;
}


问题。


是int currentLocation = stk-> head-> tos的语法;正确?它在第一个示例中返回0,在第二个示例中返回1吗?
stk-> head的语法是否为0;做我想做的事?这是在创建阶段,因此每次都指向tos为0的节点,但对我来说似乎很奇怪。
int * intStk-> contents [size];不管用。这是根据传递的内容确定数组大小的地方。我收到此错误,对我来说这没有意义。

intstk-l.c:33:14:错误:在'->'标记之前应为'=',',',';','asm'或'attribute'

int * intStk-> contents [size];

最佳答案

问题的答案按正确的顺序排列,没有立即解决,如下所示:


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


它将指针stk->head设置为空指针。它没有指向任何地方。这就引出了下一个问题。


  是int currentLocation = stk-> head-> tos的语法;正确?它在第一个示例中返回0,在第二个示例中返回1吗?


由于stk->head在创建后立即为空指针,因此尝试取消引用tos字段的尝试会使程序的行为不确定。


  int * intStk-> contents [size];不管用。这是根据传递的内容确定数组大小的地方。


不,不是。 contentsstruct intStackNode字段是一个指针。您不能将其重新定义为数组,并且这也不可能为该指针可以指向的数组分配空间。整条线都是错的。

除此之外,您的代码(不是)包含一些细微的错误,这些错误的形式是不检查malloc的返回值,并假定它将始终成功。



解决两个问题:


您已经分配了struct intStackNode,因此将stk->head指向它:

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完整的整数,则还需要分配它们:

stk->head->contents = malloc(sizeof *(stk->head->contents) * size);

if (stk->head->contents  == NULL) {
  free(stk->head);
  free(stk);
  // You know the drill, handle the error.
}

08-19 18:31