【问题标题】:Passing a struct pointer to a function in C将结构指针传递给C中的函数
【发布时间】:2012-05-12 07:14:17
【问题描述】:

我在将结构传递给以结构指针作为参数的函数时遇到问题,并不断收到错误“错误:一元'*'的无效类型参数(具有'StackNode')”

这是我的代码的必要部分(不是全部):

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

struct stackNode{
    char data;
    struct stackNode *nextPtr;
};
typedef struct stackNode StackNode;
typedef StackNode *StackNodePtr;

void convertToPostfix(char infix[], char postfix[]);
int isOperator(char c);
int precedence(char operator1, char operator2);
void push(StackNodePtr *topPtr, char value);
char pop(StackNodePtr *topPtr);
char stackTop(StackNodePtr topPtr);
int isEmpty(StackNodePtr topPtr);
void printStack(StackNodePtr topPtr);

int main(){
    convertToPostfix(NULL, NULL);
    return 0;
}

void convertToPostfix(char infix[], char postfix[]){
    StackNode stack = {'(', NULL};
    push(*stack, 'a');
    printStack(&stack);
}

void push(StackNodePtr* topPtr, char value){
    topPtr->nextPtr = NULL; //just temporary, not needed
    topPtr->data = value; //just temporary, not needed
}

任何帮助将不胜感激,谢谢

【问题讨论】:

    标签: c function structure


    【解决方案1】:

    更改push 调用,push(*stack, 'a')

    push(&stack, 'a');
         ^
    

    stack (*) 上的间接寻址没有意义,因为它不是指针。获取其地址 (&amp;) 即可。

    【讨论】:

    • 感谢您的回答,只要我从推送方法中删除额外的 * 就可以了,但是
    【解决方案2】:

    由于 StackNodePtr 已经是一个指向 StackNode 的指针,所以参数列表中不需要更多的 '*'。

    全部替换

    void push(StackNodePtr* topPtr, char value){ // WRONG
                         ^^^
    

    void push(StackNodePtr topPtr, char value){ // RIGHT
                         ^^^
    

    【讨论】:

    • 是的,你是对的,正如 cnicutar 所注意到的,nain33 试图取消引用结构而不是获取指向它的指针:)跨度>
    【解决方案3】:

    我认为你的编译器很聪明。它知道 void 指针 (NULL) 与 StackNodePtr 不同。您需要对调用进行强制转换或定义空堆栈节点指针值。

    NULLSNP=(StackNodePtr)NULL;
    

    正如另一个帖子所说,push的调用也是错误的,应该是&不是&。

    push(&stack, 'a');
    

    push 和 pop 的定义是错误的,你给它一个 stacknodeptr 但期望一个 stacknodeptr 指针。

    void push(StackNodePtr topPtr, char value)
    char pop(StackNodePtr topPtr);
    

    【讨论】:

    • 实际上在 C 中 NULL 可以不强制类型分配给任何指针:初始化器很好。
    猜你喜欢
    • 1970-01-01
    • 2012-04-21
    • 2017-10-02
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多