【问题标题】:expression must have pointer type表达式必须有指针类型
【发布时间】:2023-03-27 18:53:02
【问题描述】:

我有一个问题,程序给出了“表达式必须有指针类型”之类的错误。你能帮帮我吗?

struct stack{
    int i_data;
    char c_data;
    struct stack *next;
}top;

void push_i(struct top *newptr,int info){  

    newptr=(struct top*)malloc(sizeof(top));

    if(newptr!=NULL){
        top->c_data=NULL;
        newptr->i_data=info;
        newptr->next=*top;
        *top=newptr;
    }

【问题讨论】:

  • 这段代码还有很多错误。你为什么要传入 newptr 呢?如果意图是返回分配的内存,那么它应该是 ** 并且函数中的所有 newptr 实例都应该是 *newptr,如果代码中的每一行都被破坏了,那么这里就大错特错了。
  • 您在使用 Visual Studio 吗?你是否在某处设置了断点?

标签: c struct


【解决方案1】:
  • 您正在混合 type struct stackvariable top
  • 您的top 变量不是指针,您无法更改它指向的内容。
  • c_data 不是指针,所以不要将 NULL 分配给它。
  • 您没有将传递的 newptr 用于任何有用的东西 - 它应该是一个局部变量。

这可能会更好:

struct stack{
    int i_data;
    char c_data;
    struct stack *next;
};

...
struct stack * top = NULL; 
...
void push_i(int info){  

    struct stack * newptr=(struct stack*)malloc(sizeof(struct stack));

    if(newptr!=NULL){
        top->c_data=0;
        newptr->i_data=info;
        newptr->next=top;
        top=newptr;
    }

【讨论】:

    【解决方案2】:
    newptr->next = top
    top = newptr
    

    记住,如果 x 被声明为 T*,那么 x 是指针,*x 是 T。这真的不难理解。您要分配指针,而不是覆盖指针指向的位置。

    【讨论】:

      【解决方案3】:

      看看你的“结构堆栈”,这就是结构的描述。 顶部的下一个循环,这是您的结构的一个实例。您似乎将两者混合在一起。 任何地方都不应该有任何“struct top”,它们应该是“struct stack”。

      【讨论】:

        【解决方案4】:

        你有几个问题。第一个是您使用的是top 类型而不是变量newptr

        另外,您可能希望在传入变量时使用 **newptr。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多