【问题标题】:Operand of '*' must be a pointer error in c'*' 的操作数必须是 c 中的指针错误
【发布时间】:2021-06-02 10:37:17
【问题描述】:

我正在尝试使用 Struct 节点和链表进行分配。这是我遇到无法解决的错误的一小部分代码。请帮助提前谢谢。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

struct term{
    char term[200];
    double value;
};

void main(){
    struct term **terms = (struct term *)malloc(sizeof(struct term)); 
    // Using **terms is mandatory for the project
    *terms[0]->term = "abc";
    *terms[0]->value = 1; //This is line 15
    //I am unable to fix the error in line 15 at "*terms". 
    //The error message states "Struct term **terms: Operend of '*' must be a pointer"
    //The goal is to create nodes that can be accessed using *terms[i] with a for loop of index i
}

【问题讨论】:

  • "terms" 是一个 **,您将取消对它的引用 3 次:一次使用 *,一次使用 [],一次使用 ->。您的意思可能是“terms[0]->term”。
  • 我们通常会快速回复,但我们不会按照您的日程安排工作,因此我们通常不会接受快速回复的请求。
  • 非常感谢!它解决了问题

标签: c struct malloc nodes


【解决方案1】:

鉴于此...

    struct term **terms = (struct term *)malloc(sizeof(struct term)); 

...terms 表示struct term ** 类型的对象,一个指向struct term 的指针。在这种情况下,

  • *terms[0]-&gt;term 等同于 *((terms[0])-&gt;term) 按运算符优先级
  • terms[0] 等价于 *terms。它是struct term * 类型的指针。
  • terms[0]-&gt;term 指定terms[0] 指向的结构的成员term,它是一个数组。为了计算更大的表达式,该数组值会自动转换为指向第一个数组元素的指针。
  • 因此*terms[0]-&gt;term 表示数组terms[0]-&gt;term 中的第一个字符。它相当于terms[0]-&gt;term[0]。尝试将字符串文字分配给这个字符是没有意义的。

同样,terms[0]-&gt;value 指定terms[0] 指向的结构的成员value这不是一个指针,因此它不是* 运算符的合适操作数。这就是你的编译器的错误信息告诉你的。

从句法上讲,这些都与terms 的类型一致:

  • terms[0]-&gt;value = 1;
  • (*terms[0]).value = 1;
  • (*terms)-&gt;value = 1;

但是,即使使用其中之一,代码仍然会被严重破坏。我已经提到了对*terms[0].term 的错误分配。此外,malloc() 调用为terms 保留了错误的内存量,尽管对于单个struct term * 来说可能绰绰有余。然而,最成问题的是,terms[0] 本身,即指针,从未使用有效(指针)值进行初始化。它并不指向您可以实际分配给其成员的任何内容。那么,您可能想要更像这样的东西:

    struct term **terms = malloc(sizeof(*terms)); // enough space for one pointer
    *terms = malloc(sizeof **terms));             // enough space for one struct term

    strcpy(terms[0]->term, "abc");
    terms[0]->value = 1;
    // ...

另外,main() 的返回类型必须是 int,而不是 void

【讨论】:

    【解决方案2】:

    此实现存在一些问题。首先,您正在创建一个双指针,因此您还需要为您指向的内部指针分配内存。

    struct term** terms = (struct term**)malloc(sizeof(struct term*));
    
    *terms = (struct term*)malloc(sizeof(struct term));
    

    其次,您不能执行如下所示的实现。

    char c[5];
    void main(void)
    {
        c = "abc";
    }
    

    这是错误的,编译器会抛出错误。您可以做的是将每个字符一个接一个地分配给 char 数组。或者你也可以使用strcpy

    ((*terms)->term)[0] = 'a';
    ((*terms)->term)[1] = 'b';
    ((*terms)->term)[2] = 'c';
    

    【讨论】:

      【解决方案3】:

      变量“terms”是一个 **(指向指针的指针),但您要取消对它的引用 3 次:一次使用 *,一次使用 [],一次使用 ->。您的意思可能是“terms[0]->term”。

      【讨论】:

      • 第二句可以,第一句不行。 * 不取消引用 terms 或其直接表达,而是 termvalue 成员
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 2013-07-29
      • 1970-01-01
      相关资源
      最近更新 更多