2016-04-30 105 views
0

我正在学习C,并试图为实践创建一个ArrayList当我尝试编译此代码时,出现了很多错误,但我想不通为什么我收到这样的:C - 错误:期望的标识符或'('之前的'void'

TEST.C:12:13:错误:预期标识符或 '(' 前 '无效' 结构的init(无效);

有没有很多关于谷歌这个错误连接到无效,所以任何帮助将不胜感激,谢谢!

#include <stdio.h> 
    #include <stdlib.h> 

    struct ArrayList { 
    int size; 
    int typeSize; 
    int index; 
    int array[]; 
}; 

struct init(void); 

void add(struct list, int x); 

int get(struct list, int x); 


int main() { 
    struct ArrayList list = init(); 
    add(list, 4); 
    printf("%d", get(list, 0)); 
    return 0; 
} 


struct init(void) { 
    ArrayList this; 
    this.size = 0; 
    this.index = 0; 
    return this; 
} 

void add(struct list, int x) { 
    list->array[size] = x; 
    size++; 
} 

int get(struct list, int index) { 
    return list->array[index]; 
} 
+0

顺便说一句'list-> array [size] = x; – BLUEPIXY

+0

并用'struct ArrayList * list'替换'struct list' – BLUEPIXY

回答

2

Th e结构名称丢失。

struct ArrayList init(void); 

struct ArrayList init(void) { 
    ArrayList this; 
    this.size = 0; 
    this.index = 0; 
    return this; 
} 

另一个问题,array是不是在你的情况下进行初始化,这将是不确定的行为在addget使用它:

struct ArrayList init(void) { 
    ArrayList this; 
    this.size = 0; 
    this.index = 0; 
    return this; 
} 

在这种情况下,灵活的阵列成员array不相关与任何存储相比,最好这样做:

struct ArrayList* init(void) { 
    ArrayList *this = malloc(sizeof(struct ArrayList) + sizeof(int[NUM])); 
    this->size = NUM; 
    this->index = 0; 
    return this; 
} 

addget功能需要太固定的:

void add(struct ArrayList *list, int x) { 
    list->array[list->index++] = x; 
} 

int get(struct ArrayList *list, int index) { 
    return list->array[index]; 
} 
+0

'this.array = malloc(SIZE * sizeof(int));'无法编译。 'this.array'是灵活的数组,不是指针。 – BLUEPIXY

+1

@BLUEPIXY你是对的,整个结构需要为数组分配存储空间,'struct ArrayList list * = malloc(sizeof(struct ArrayList)+ sizeof(int [size]));'但是OP的init '返回一个结构体,而不是一个指针,这会让这个变得困难。 – fluter

+0

更正了该帖子。 – fluter

0

struct init(void); - 它看起来像没有参数的函数返回一个struct。但是什么struct?可能struct ArrayList

对于其余外观struct而言,没有struct类型的名称也是如此。

4
struct init(void); 

这是一个语法错误。

鉴于类型声明struct ArrayList { ... },类型的名称是struct ArrayList。如果init应该返回ArrayList结构,它需要被声明为:

struct ArrayList init(void); 

您还在init函数的定义有一个错误。此声明:

ArrayList this; 

需求是:

struct ArrayList this; 

(作为一个风格上看,你可能会考虑使用比this以外的名称在C++中,this是一个关键词,你使用。作为一种方式的标识符与它的C++的意思不一致,这是完全合法的,但它可能会造成一些混乱。我建议称之为result。)

1
struct init(void); 

struct本身不是一个足够的类型。你可能想使用这样的代替:

struct ArrayList init(void); 
0

你在你的数据类型,有这么多的错误.. 结构是不是数据类型。检查这个。我已经改变了你的代码。记住如果你打算使用指针,你至少应该通过地址

#include <stdio.h> 
#include <stdlib.h> 

struct ArrayList { 
int size; 
int typeSize; 
int index; 
int *array; 
}; 

struct ArrayList init(); 

void add(struct ArrayList* list, int x); 

int get(struct ArrayList* list, int x); 


int main() { 
    struct ArrayList list = init(); 
    add(&list, 4); 
    printf("%d", get(&list, 0)); 
    return 0; 
} 


struct ArrayList init() { 
    struct ArrayList this; 
    this.size = 0; 
    this.index = 0; 
    this.array = (int*)malloc(sizeof(int) * /*numOfelementsToBeInserted*/); 
    return this; 
} 

void add(struct ArrayList *list, int x) { 
    list->array[list->size] = x; 
    list->size++; 
} 

int get(struct ArrayList *list, int index) { 
    return list->array[index]; 
} 
+0

我修改了我的代码,它和你在这里发布的内容类似,有一件事我改变了,我把struct []放到了int *数组中,我得到了预期的输出,但是我也得到了“ test.exe停止工作“错误,并通过调试,我发现这发生在你的第一行添加。任何想法为什么? –

+0

如果你改变你的**结构从array []到int * array **你仍然需要分配的空间,用元素来验证 – jnapor

+0

我加了这个:struct ArrayList * newList = malloc(sizeof(struct ArrayList)+ sizeof(int)* 20);我相信这会为int *分配空间,正确吗? –

相关问题