2

我正在自学 C,因为我的 uni 似乎对 java 很着迷,所以我编写了一个 int 类型的堆栈实现(我担心以后让它泛型)。我遇到了一个对我来说没有意义的错误,missing ';' before 'type'. 据我所知,我的语法是正确的,如果不是,请告诉。无论如何,这是我的代码:

堆栈.h

typedef struct{
    int *elements;
    int size;
    int capacity;
}Stack;

void newStack(Stack *s);
void delStack(Stack *s);
void pushToStack(Stack *s, int value);
int popFromStack(Stack *s);

堆栈.c

#include "stack.h"
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>

void newStack(Stack *s){
    s->size = 0;
    s->capacity = 4;
    s->elements = (int*) malloc(4 * sizeof(int));

    assert(s->elements != NULL); // allocation worked?
}

void delStack(Stack *s){
    free(s->elements);
}

void pushToStack(Stack *s, int value){
    if(s->size == s->capacity){
        s->size *= 2;
        s->elements = (int *) realloc(s->elements, s->size * sizeof(int));

        assert(s->elements !=NULL); //reallocation worked?
    }
    s->elements[s->size] = value;
    s->size++;
}

int popFromStack(Stack *s){
    assert(s->size>0);
    s->size --;
    return s->elements[s->size];
}

int main()
{
    Stack s1;
    newStack(&s1);
    int i;
    for(i=0; i<3; i++){
        pushToStack(&s1, i);
        printf("%d ", i);
    }
        printf("\n");
    for(i=0; i<3; i++){
        printf("%d ", popFromStack(&s1));
    }

    delStack(&s1);

    getchar();
    return 0;
}

错误发生在主线上int i;,但如果我将线向上移动,错误就会消失,程序运行完美。我想知道为什么。

导致错误:

    newStack(&s1);
    int i;

没有错误:

    int i;
    newStack(&s1);

PS:以防万一……我正在使用 MS Visual Studio 2010

4

3 回答 3

8

Visual Studio 在 1998 年之前的某个地方陷入了时间循环,当时标准要求所有声明都应位于块的开头。

这在 C99 中有所改变,MS 确实表示它支持最流行的功能。可悲的是,这不是其中之一。

于 2012-08-19T21:49:05.817 回答
1

在 C 中,您必须在作用域的开头声明所有变量。所以你不能i在你newStack打电话后声明。

于 2012-08-19T21:49:01.697 回答
1

在 C89 中,声明是在作用域的顶部进行的,因此在任何其他函数调用之前。

然而,这个限制在 C99 中被删除了。

于 2012-08-19T21:50:24.753 回答