预期声明说明符或'&'标记前的'...'

时间:2016-03-12 00:19:16

标签: c compiler-errors

我是C的初学者,我只有13年,所以我很确定错误是非常基本的。

我在学校很无聊,我开始写C关于“游戏”。

就是这样:

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

typedef struct {
    int * id;
    int * posx;
    int * posy;
    char * name;
} entity;

int allocData(&entity) {
    entity->id = malloc(sizeof(int));
    if(entity->id == NULL) {
        return 1;
    }
    entity->posx = malloc(sizeof(int));
    if(entity->posx == NULL) {
        return ;
    }
    entity->posy = malloc(sizeof(int));
    if(entity->posy = NULL) {
        return 1;
    }
    entity->name = malloc(sizeof(char) * 129);
    if(entity->name == NULL) {
        return 1;
    }
    return 0;
}

int main() {
    entity player;
    allocData(&player);
    player.id = 0;
    player.name = "loopback\0";
    printf("ID: %d, Name: %s", player.id, player.name);
    return 0;
}
但是GCC抱怨道。

main.c:11:15: error: expected declaration specifiers or ‘...’ before ‘&’ token
 int allocData(&entity) {
               ^

我找不到错误,我不想在这里发帖,我确定我错过了一些蠢事。

3 个答案:

答案 0 :(得分:4)

您的函数定义应将指针作为参数:

int allocData(entity *player);

答案 1 :(得分:3)

您的原型看起来不对:

  

int allocData(&amp; entity)//&lt; - 什么是类型?以及为什么它在这里的地址运算符?

应该是:

int allocData(entity * p_entity)

您还应该替换函数entity中的所有allocData变量名称 - 请记住entity是您的类型名称,而不是变量。

答案 2 :(得分:3)

您不能在C中使用引用。

在这种情况下,您应该使用指针。

将行int allocData(&entity) {更改为int allocData(entity *entity) {,代码将编译。

虽然此更改将使代码编译,但您将通过将具有错误类型的数据传递给printf()来调用未定义的行为%d期望int,但是你通过了int*。抛弃allocData()中指向的指针也会导致内存泄漏。我不认为使用指针,除非它们是不合适的。

您的代码应该是这样的:

#include <stdio.h>
#include <stdlib.h>
#include <string.h> /* add this for using strcpy() */

typedef struct {
    int id;
    int posx;
    int posy;
    char name[129];
} entity;

/* now allocData() won't be needed because entity doesn't have any member to allocate pointer to */

int main(void) {
    entity player;
    player.id = 0;
    /* use strcpy() to copy strings */
    /* \0 here will be meaningless in this case, so I removed this */
    strcpy(player.name, "loopback");
    printf("ID: %d, Name: %s", player.id, player.name);
    return 0;
}