访问返回的结构变量

时间:2017-10-06 22:11:48

标签: c

所以我有函数top()返回堆栈的顶部(实现为链表)。它返回一个Node结构。当我尝试访问返回的struct的变量时,我收到错误。

typedef struct nodeStrcut{
    int x,y;
    struct nodeStrcut* next;
}Node;

Node top(Node** head){
    return **head; 
}

void push(Node** head, int x, int y){
    //create a new node to contain the value 
    Node* newPtr = (Node*) malloc(sizeof(Node));
    newPtr->x = x;
    newPtr->y = y; 
    newPtr->next = *head;
    *head = newPtr; 
}

int main(int argc, char **argv){
    Node* stack;
    stack = NULL;
    push(&stack, 3, 3);
    push(&stack, 2, 3);
    push(&stack, 3, 5);
    printf("Node value: %d, %d\n", (pop(&stack)).x, (pop(&stack)).y); 
    return -1;
}

然后我收到以下错误:

project.c: In function ‘main’:
error: request for member ‘x’ in something not a structure or union
error: request for member ‘y’ in something not a structure or union

我知道我可以使用stack-> x来获取值,但我需要一个从堆栈的停止处返回值的函数。帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

我认为这只是一个拼写错误(pop而不是top),这样您实际上调用的库函数不会返回Node类型。写printf("Node value: %d, %d\n", top(&stack).x, top(&stack).y);,它应该按预期工作。

答案 1 :(得分:1)

Node* newPtr = (Node*) malloc(sizeof(Node));

没有必要强制转换malloc,这是不必要的。见:Do I cast the result of malloc?。以下就足够了:

Node *newPtr = malloc (sizeof *newPtr);

head的{​​{1}}地址未在top中更改,因此无需传递head的地址,例如

Node top (Node *head){
    return *head;
}

您不应该从main()返回否定值。有两个定义的回报:

EXIT_SUCCESS: 0
EXIT_FAILURE: 1

See What should main() return in C and C++?

完全放弃:

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

typedef struct nodeStrcut{
    int x,y;
    struct nodeStrcut* next;
} Node;

Node top (Node *head){
    return *head;
}

void push (Node **head, int x, int y) {

    Node *newPtr = malloc (sizeof *newPtr);
    newPtr->x = x;
    newPtr->y = y;
    newPtr->next = *head;
    *head = newPtr;
}

int main (void) {

    Node *stack = NULL;

    push (&stack, 3, 3);
    push (&stack, 2, 3);
    push (&stack, 3, 5);

    printf ("Node value: %d, %d\n", (top (stack)).x, (top (stack)).y);

    return 0;
}

示例使用/输出

$ ./bin/stacktop
Node value: 3, 5

答案 2 :(得分:0)

您无需传入指向top()中指针的指针。将函数定义从Node top(Node** head)更改为Node top(Node* head)就足够了。

现在,在调用以下内容时,您不需要传递stack的地址(没有拼写错误):

printf("Node value: %d, %d\n", (top(stack)).x, (top(stack)).y);