Warum ist & in C nicht erlaubt, aber in diesem Fall in C ++? Gibt es einen Unterschied? [Duplikat]
Nov 30 2020
Hier ist mein C-Code, den ich verwende. void InitList(List &L);
Das Buildlog von Code :: Blocks weist jedoch einen Fehler auf:
erwartet ';', ',' oder ')' vor '&' Token
#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;
}
Aber ich habe es in C ++ versucht, es gibt keinen Fehler:
#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;
}
Antworten
2 Monstarules Dec 01 2020 at 02:09
Sie können dies nicht in einer Funktionsdeklaration in C übergeben. Sie müssen * verwenden, wenn Sie den Zeiger auf diese Daten verweisen möchten.
void InitList(List *L)
{
L->data = malloc(sizeof(ElementType)*MaxSize);
L->CurLength = 0;
}
Und dann
List *L;
InitList (&L);
1 RemyLebeau Dec 01 2020 at 02:22
In void InitList(List &L);
, L
wird von geleitet Referenz . C unterstützt keine Referenzen, das ist eine C ++ - Funktion. In C müssen Sie L
stattdessen einen Zeiger übergeben (genau das main()
versuchen Sie bei der Verwendung List L; InitList(&L);
, aber die Deklaration von InitList()
ist dafür falsch), z.
#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;
}