Pourquoi `&` n'est pas autorisé en C, mais en C ++ dans ce cas? Y a-t-il une différence? [dupliquer]
Nov 30 2020
Voici mon code C, j'utilise void InitList(List &L);
Cependant le buildlog de Code :: Blocks a une erreur:
attendu ';', ',' ou ')' avant le jeton '&'
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10
typedef int ElementType;
struct SeqList;
typedef struct SeqList List;
void InitList(List &L);
struct SeqList
{
ElementType *data;
int CurLength;
};
/*----------------------------------*/
void InitList(List &L)
{
(&L)->data = malloc(sizeof(ElementType)*MaxSize);
(&L)->CurLength = 0;
}
int main()
{
List L;
InitList(&L);
return 0;
}
Mais j'ai essayé en C ++, il n'y a pas d'erreur:
#include <iostream>
using namespace std;
#define InitSize 100
typedef int ElementType;
struct SeqList;
typedef struct SeqList List;
void InitList(List &L);
struct SeqList
{
ElementType *data;
int CurLength;
};
/*----------------------------------*/
void InitList(List &L)
{
L.data = new ElementType[InitSize]; //L.data = malloc(...)
L.CurLength = 0;
}
int main()
{
List L;
InitList(L);
return 0;
}
Réponses
2 Monstarules Dec 01 2020 at 02:09
Vous ne pouvez pas transmettre cela dans une déclaration de fonction en C. Vous devez utiliser * si vous souhaitez référencer le pointeur vers ces données.
void InitList(List *L)
{
L->data = malloc(sizeof(ElementType)*MaxSize);
L->CurLength = 0;
}
Et alors
List *L;
InitList (&L);
1 RemyLebeau Dec 01 2020 at 02:22
In void InitList(List &L);
, L
est passé par référence . C ne prend pas en charge les références, c'est une fonctionnalité C ++. En C, vous devez L
plutôt passer par pointeur (ce qui est exactement ce que vous main()
essayez de faire lors de l'utilisation List L; InitList(&L);
, mais la déclaration de InitList()
est fausse pour cela), par exemple:
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10
typedef int ElementType;
struct SeqList;
typedef struct SeqList List;
void InitList(List *L);
void CleanupList(List *L);
struct SeqList
{
ElementType *data;
int CurLength;
};
/*----------------------------------*/
void InitList(List *L)
{
L->data = malloc(sizeof(ElementType)*MaxSize);
L->CurLength = 0;
}
void CleanupList(List *L)
{
free(L->data);
L->CurLength = 0;
}
int main()
{
List L;
InitList(&L);
...
CleanupList(&L);
return 0;
}