我正在学习C,并且正在尝试为练习创建一个ArrayList。当我尝试编译这段代码时,我遇到了很多错误,但我无法弄清楚为什么会这样:
Test.c:12:13:错误:预期的标识符或'(' before' void' struct init(void);
关于此错误与谷歌关于虚空没有多少,所以任何帮助将不胜感激。谢谢!
#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 :(得分: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 :(得分:2)
缺少结构名称。
struct ArrayList init(void);
struct ArrayList init(void) {
ArrayList this;
this.size = 0;
this.index = 0;
return this;
}
另一个问题,array
在您的情况下未初始化,在add
和get
中使用它是未定义的行为:
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;
}
add
和get
功能也需要修复:
void add(struct ArrayList *list, int x) {
list->array[list->index++] = x;
}
int get(struct ArrayList *list, int index) {
return list->array[index];
}
答案 2 :(得分:1)
struct init(void);
struct本身并不是一个足够的类型。你可能想要使用这样的东西:
struct ArrayList init(void);
答案 3 :(得分:0)
struct init(void);
- 它看起来像一个没有参数的函数返回struct
。但struct
是什么?可能是struct ArrayList
。
struct
的其他外观与struct
类型的名称相同。
答案 4 :(得分:0)
您的数据类型中有很多错误。 struct不是数据类型。检查一下。我已经改变了你的代码。请记住,如果您要使用指针,至少应该传递地址
#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];
}