在struct中分配内存时不兼容的类型

时间:2015-09-15 09:41:17

标签: c arrays pointers struct

我制作了一个程序而不知道为什么Code::Blocks会给我一些错误:

error: conflicting types for 'loadSavedGame'
note: previous declaration of 'loadSavedGame' was here(In headers of file)
In function 'loadSavedGame':error: incompatible types when assigning to type 'struct saveGame' from type 'struct saveGame *'

我不明白,因为给我一个错误,如果我以同样的方式宣布其他函数,请看:

        struct configParam{
           char *clave;
           char *valor;
        };

        struct saveGame{
           char *id;
           char *score;
           char *position;
           char *maze_level;
           char *achievements;
           char *time_playing;
           char *virtual_players;
        };

        void loadSettings(char fileName[],struct configParam *paramsReaded[], int *length, int *statusCode);
        void saveSettings(char fileName[],struct configParam paramsToWrite[], int length, int *statusCode);

        void loadSavedGame(char fileName[],struct saveGame *savedGamesReaded[], int *length, int *statusCode);
        void saveGame(char fileName[],struct saveGame savedGamesToWrite[], int length, int *statusCode);

    void loadSettings(char fileName[],struct configParam *paramsReaded[], int *length, int *statusCode){


        *paramsReaded = (struct configParam*)malloc((*length)*sizeof(struct configParam)); //THIS WORK
        int j;
        for(j=0; j<*length; j++){
            (*paramsReaded)[j].clave = (char *)malloc(MAX_STRING*sizeof(char)); //reserva de memoria para los miembros "clave" y "valor" de la estructura
            (*paramsReaded)[j].valor = (char *)malloc(MAX_STRING*sizeof(char));
        }

    }

void loadSavedGame(char fileName[], struct saveGame *savedGamesReaded, int *length, int *statusCode){

    *savedGamesReaded = (struct saveGame*)malloc((*length)*sizeof(struct saveGame)); // HERE SHOW AN ERROR :(
    int j;
    for(j=0; j<*length; j++){
        (*savedGamesReaded)[j].id = (char *)malloc(MAX_STRING*sizeof(char)); 
        (*savedGamesReaded)[j].score = (char *)malloc(MAX_STRING*sizeof(char));
        (*savedGamesReaded)[j].position = (char *)malloc(MAX_STRING*sizeof(char));
        (*savedGamesReaded)[j].maze_level = (char *)malloc(MAX_STRING*sizeof(char));
        (*savedGamesReaded)[j].achievements = (char *)malloc(MAX_STRING*sizeof(char));
        (*savedGamesReaded)[j].time_playing = (char *)malloc(MAX_STRING*sizeof(char));
        (*savedGamesReaded)[j].virtual_players = (char *)malloc(MAX_STRING*sizeof(char));
    }






}

两个函数的工作方式基本相同,只有“loadsaveGame”指向更长的数组,然后我不知道为什么它不起作用(函数loadsaveGame) 谢谢你的回复人员

3 个答案:

答案 0 :(得分:2)

让我们将其进一步减少到OnSubscribeInputStreamToLines ......

void loadSettings(struct configParam *paramsReaded[]){
    *paramsReaded = malloc(42); // This compiles.
}

void loadSavedGame(struct saveGame *savedGamesReaded){
    *savedGamesReaded = malloc(42); // This doesn't.
}

有什么区别?让我们进一步研究剥离参数标识符和主体以形成这两个函数的原型:

void loadSettings(struct configParam *[]);
void loadSavedGame(struct saveGame *);

你现在看到了区别吗?第一个使用两个间接级别(*[]),而第二个级别仅使用一个间接级别。

如果您打算在loadSettings返回后分配给存在的对象,则第一个使用正确的习语。它看起来很健全。

第二个尝试使用相同的模式,但它缺少[] ...嗯?

P.S。为了将来参考,请了解如何制作MCVE,以便您可以更轻松地发现这些简单的印刷问题。

P.P.S。在尝试将某些内容存储到它指向的对象之前,请不要忘记检查malloc(对于NULL值)的返回值。

答案 1 :(得分:0)

你得到错误

  

错误:&#39; loadSavedGame&#39;

的冲突类型      

注意:先前声明了'loadSavedGame&#39;在这里(在文件的标题中)

是因为这是函数loadSavedGame的原型 -

void loadSavedGame(char fileName[],struct saveGame *savedGamesReaded[], int *length, int *statusCode);

虽然定义你写了 -

void loadSavedGame(char fileName[], struct saveGame *savedGamesReaded, int *length, int *statusCode){

参见

中参数二的类型 第一个struct saveGame *savedGamesReaded[](结构指针数组)中的

1。

2。在定义函数struct saveGame *savedGamesReaded(指向struct的指针)时的第二个

因此类型冲突,错误。你在定义函数时错过[]

下一个错误是由于这个 -

 *savedGamesReaded = (struct saveGame*)malloc((*length)*sizeof(struct saveGame)); // HERE SHOW AN ERROR :(

这也是由于上述问题。如果保留指针数组,即struct saveGame *savedGamedReaded[],这将是一个有效的语句,并且不会产生错误。由于*[]将提供两个间接级别。

但如果没有,那么使用*会产生问题。然后你将不得不删除它。

答案 2 :(得分:0)

以下代码可能更多是您要实施的内容

代码需要对每个malloc添加的

进行错误检查

从代码中删除所有'混乱'。 从代码中删除所有未使用的函数参数 代码编译时没有错误/警告

#include <stdlib.h>


#define MAX_STRING (100)

struct configParam
{
   char *clave;
   char *valor;
};

struct saveGame
{
   char *id;
   char *score;
   char *position;
   char *maze_level;
   char *achievements;
   char *time_playing;
   char *virtual_players;
};

//prototypes
void loadSavedGame(struct saveGame **savedGamesReaded, int *length );
void loadSettings( struct configParam **paramsReaded, int *length );

void loadSettings( struct configParam **paramsReaded, int *length )
{
    *paramsReaded = malloc((*length)*sizeof(struct configParam)); //THIS WORK
    int j;
    for(j=0; j<*length; j++)
    {
        (*paramsReaded)[j].clave = malloc(MAX_STRING); //reserva de memoria para los miembros "clave" y "valor" de la estructura
        (*paramsReaded)[j].valor = malloc(MAX_STRING);
    }

}

void loadSavedGame(struct saveGame **savedGamesReaded, int *length )
{
    *savedGamesReaded = malloc((*length)*sizeof(struct saveGame));
    int j;
    for(j=0; j<*length; j++)
    {
        (*savedGamesReaded)[j].id              = malloc(MAX_STRING);
        (*savedGamesReaded)[j].score           = malloc(MAX_STRING);
        (*savedGamesReaded)[j].position        = malloc(MAX_STRING);
        (*savedGamesReaded)[j].maze_level      = malloc(MAX_STRING);
        (*savedGamesReaded)[j].achievements    = malloc(MAX_STRING);
        (*savedGamesReaded)[j].time_playing    = malloc(MAX_STRING);
        (*savedGamesReaded)[j].virtual_players = malloc(MAX_STRING);
    }
} // end function: loadSavedGame