なぜ `&`はCでは許可されていませんが、この場合はC ++で許可されていますか?何か違いはありますか?[複製]
Nov 30 2020
これが私のCコードですが、使用しvoid InitList(List &L);
ていますが、Code :: Blocksのビルドログにエラーがあります:
'&'トークンの前に ';'、 '、'、または ')'が必要です
#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;
}
しかし、私はC ++で試しましたが、エラーはありません。
#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;
}
回答
2 Monstarules Dec 01 2020 at 02:09
Cの関数宣言でそれを渡すことはできません。そのデータへのポインターを参照する場合は、*を使用する必要があります。
void InitList(List *L)
{
L->data = malloc(sizeof(ElementType)*MaxSize);
L->CurLength = 0;
}
その後
List *L;
InitList (&L);
1 RemyLebeau Dec 01 2020 at 02:22
でvoid InitList(List &L);
、L
は参照によって渡されています。Cは参照、つまりC ++機能をサポートしていません。Cでは、L
代わりにポインタを渡す必要があります(これはmain()
、を使用するときに実行しようとしていることですList L; InitList(&L);
が、の宣言InitList()
は間違っています)。例:
#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;
}