指针的指针作为函数参数

时间:2018-01-07 05:43:17

标签: c function pointers arguments

   typedef struct rilevamenti {
   char     idStazione[4];
   ...
   struct   rilevamenti* next;
} rilevamenti_t;

void push (rilevamenti_t ** head, char id[], char nome[], char codice[], float quant, char data[]);


int main(int argc, char **argv)
{

    FILE *fp;
    char    tmpIdStazione[4];
    char    tmpNomeParametro[200];
    char    tmpCodiceParametro[6];
    float   tmpQuantita;
    char    tmpData[8];


    fp = fopen("file1.txt", "r");
    if(fp == NULL) 
    {
    perror("Error in opening file1.txt");
    return(-1);
    }

    rilevamenti_t * lista1 = NULL;


   while(1){

           fscanf(fp, "%s", tmpIdStazione);
           printf("Stazione: %s\n", tmpIdStazione );
           ...

           push (lista1, tmpIdStazione, ...);

        if( feof(fp) ) { 
         break ;
      }
   }
    fclose(fp); 

    return 0;
}


void push(rilevamenti_t ** head, char id[], char nome[], char codice[], float quant, char data[]) 
{
    rilevamenti_t * new_rilevamento;
    new_rilevamento = (rilevamenti_t *)malloc(sizeof(rilevamenti_t));

    strncpy(new_rilevamento->idStazione, id, 4);
    ...
    *head = new_rilevamento;
}

我认为我在推动功能的调用中缺少一些东西, 我的idead是将列表的头指针作为指针传递, 所以我可以从列表的头部逐个添加所有列表结构,只需更改第一个指针。

但我很震惊,老实说,经过大量的java和C#后,我对C有点生疏了:/

我设置“...”只是为了让代码变短,在那里我列出了所有结构的成员并逐个填充它们。

1 个答案:

答案 0 :(得分:0)

在这种情况下rilevamenti_t*传递&lista1的地址。它将是

push (&lista1, tmpIdStazione, ...);

在您出现类型不匹配之前。并且您传递了一个指针(rilevamenti_t *),其中指向了双指针(rilevamenti_t**)。这导致了未定义的行为。(您正在取消引用NULL)。

不要转换malloc的返回值并检查malloc的返回值。