:error: expected expression before 'struct'
:error: expected expression before 'struct'
我正在用 C 语言做一个关于链表的实验,我遇到了一个我似乎无法摆脱的错误。实验将在 2 小时内完成,所以任何帮助都会很棒!
这是我的代码:
void insert(int x, struct Node **pL)
{
if(*pL == NULL){
*pL = malloc(sizeOf(struct Node *pL)); // error here
*pL->value = x; // error #2
*pL->next = NULL;
}else if(*pL != NULL){
insert(x, &((*pL)->next));
}
}
有什么想法吗?!!
那涵盖了那个错误,但现在我收到一条错误消息,“错误:请求成员 'value' 不是结构或联合。
完成!感谢您提供的所有帮助!
试试这个:
*pL = malloc(sizeof(*pL));
运算符是sizeof
,不是sizeOf
。
此外,struct Node *pL
是一个 声明 ,将其传递给 sizeof
没有任何意义。 sizeof
需要类型或变量。
你的第二个错误是由于运算符的优先级。
->
的优先级高于 *
。所以 *pL->value
被评估为 *(pL->value)
而不是 (*pL)->value
void insert(int x, struct Node **pL)
{
到目前为止,这告诉您您得到了一个指向指针的指针,这是一个明确的标志,如果需要,您的函数应该修改 *pL
。
if(*pL == NULL){
*pL = malloc(sizeOf(struct Node *pL)); // error here
你在这里尝试,但语法错误。首先是 sizeof
,而不是 sizeOf
。 C 区分大小写。然后 sizeof
运算符采用 类型 或 表达式来确定其存储大小。所以你可以写 sizeof(struct Node)
或 sizeof(**pL)
。注意这里的 double 星号,你想要的是 struct Node
的存储大小并且只有一个星号,你的表达式将是 struct Node *
类型(a 指针指向struct Node
).
*pL->value = x; // error #2
这是错误的,因为 ->
的优先级高于 *
,所以它意味着 *(pL->value) = x;
。 不是你想要的,你想要的(*pL)->value = x;
。
*pL->next = NULL;
}else if(*pL != NULL){
这一行没有多大意义(尽管不完全是错误)。 *pL
可以是 NULL
或 而不是 是 NULL
。一个普通的 else
就可以了。
insert(x, &((*pL)->next));
}
}
我真的很想知道为什么你在 this 最后一行中得到了正确的括号,但仍然看不到你自己上面几行的错误?在这里补充一下:精确和认真在编程中是至关重要的(在像 C 这样的语言中更是如此)。
总而言之,代码大概应该是这样的:
void insert(int x, struct Node **pL)
{
if(*pL == NULL) {
*pL = malloc(sizeof(struct Node));
(*pL)->value = x;
(*pL)->next = NULL;
} else {
insert(x, &((*pL)->next));
}
}
我正在用 C 语言做一个关于链表的实验,我遇到了一个我似乎无法摆脱的错误。实验将在 2 小时内完成,所以任何帮助都会很棒!
这是我的代码:
void insert(int x, struct Node **pL)
{
if(*pL == NULL){
*pL = malloc(sizeOf(struct Node *pL)); // error here
*pL->value = x; // error #2
*pL->next = NULL;
}else if(*pL != NULL){
insert(x, &((*pL)->next));
}
}
有什么想法吗?!!
那涵盖了那个错误,但现在我收到一条错误消息,“错误:请求成员 'value' 不是结构或联合。
完成!感谢您提供的所有帮助!
试试这个:
*pL = malloc(sizeof(*pL));
运算符是sizeof
,不是sizeOf
。
此外,struct Node *pL
是一个 声明 ,将其传递给 sizeof
没有任何意义。 sizeof
需要类型或变量。
你的第二个错误是由于运算符的优先级。
->
的优先级高于 *
。所以 *pL->value
被评估为 *(pL->value)
而不是 (*pL)->value
void insert(int x, struct Node **pL)
{
到目前为止,这告诉您您得到了一个指向指针的指针,这是一个明确的标志,如果需要,您的函数应该修改 *pL
。
if(*pL == NULL){
*pL = malloc(sizeOf(struct Node *pL)); // error here
你在这里尝试,但语法错误。首先是 sizeof
,而不是 sizeOf
。 C 区分大小写。然后 sizeof
运算符采用 类型 或 表达式来确定其存储大小。所以你可以写 sizeof(struct Node)
或 sizeof(**pL)
。注意这里的 double 星号,你想要的是 struct Node
的存储大小并且只有一个星号,你的表达式将是 struct Node *
类型(a 指针指向struct Node
).
*pL->value = x; // error #2
这是错误的,因为 ->
的优先级高于 *
,所以它意味着 *(pL->value) = x;
。 不是你想要的,你想要的(*pL)->value = x;
。
*pL->next = NULL;
}else if(*pL != NULL){
这一行没有多大意义(尽管不完全是错误)。 *pL
可以是 NULL
或 而不是 是 NULL
。一个普通的 else
就可以了。
insert(x, &((*pL)->next));
}
}
我真的很想知道为什么你在 this 最后一行中得到了正确的括号,但仍然看不到你自己上面几行的错误?在这里补充一下:精确和认真在编程中是至关重要的(在像 C 这样的语言中更是如此)。
总而言之,代码大概应该是这样的:
void insert(int x, struct Node **pL)
{
if(*pL == NULL) {
*pL = malloc(sizeof(struct Node));
(*pL)->value = x;
(*pL)->next = NULL;
} else {
insert(x, &((*pL)->next));
}
}