Почему `&` не разрешено в 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;
}