【问题标题】:Passing struct* and loading the struct in other function传递 struct* 并在其他函数中加载结构
【发布时间】:2012-11-19 02:46:10
【问题描述】:

它无法编译,我不知道自己在做什么错。当我尝试这样做时:

(ultimo->siguiente)=nnodo; 

编译器不允许我这样做。两者都不起作用:

scanf("%d", &(nnodo->dni));

PD:baja 和 modif 函数仍未完成,但它们不应与主程序发生任何冲突。


编译器输出(Visual Studio 2010):

错误 2 错误 C2037: 'siguiente' 左侧指定未定义的结构/联合 'stru' c:\documents and settings\emiliano\desktop\asdc.c 52 1 abm

错误 3 错误 C2037:“dni”左侧指定未定义的结构/联合“stru”c:\documents and settings\emiliano\desktop\asdc.c 55 1 abm

4 IntelliSense:不允许指向不完整类类型的指针 c:\documents and settings\emiliano\desktop\asdc.c 52 3 abm

5 IntelliSense:不允许指向不完整类类型的指针 c:\documents and settings\emiliano\desktop\asdc.c 55 15 abm


我认为我的 typedef 是正确的,但我真的不知道。

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

typedef struct stru* pstru;

typedef struct{
    int dni;
    pstru siguiente;
}stru;



pstru alta(pstru ultimo);
pstru baja(pstru ultimo);
pstru modif(pstru ultimo);
int menu(pstru ultimo);

int main(){
    pstru ultimo;
    ultimo=(pstru)malloc(sizeof(stru));

    menu(ultimo);
    return 0;
}

int menu(pstru ultimo){

    int opc;
    printf("Para alta (1), para baja (2), para modif (3), para salir (4)\n");
    scanf("%d", &opc);

    switch(opc){
        case 1:
            ultimo=alta(ultimo);
            break;
        case 2:
            ultimo=baja(ultimo);
            break;
        case 3:
            ultimo=modif(ultimo);
            break;
        case 4:
            return 0;
    }
    menu(ultimo);
    return 0;
}

pstru alta(pstru* ultimo){
    pstru nnodo;
    nnodo=(pstru)malloc(sizeof(stru));
    (ultimo->siguiente)=&nnodo;

    printf("Ingrese DNI\n");
    scanf("%d", &(nnodo->dni));

    ultimo=nnodo;

    return ultimo;
}

pstru baja(pstru ultimo){
    return ultimo;
}

pstru modif(pstru ultimo){
    return ultimo;
}

【问题讨论】:

    标签: c pointers structure


    【解决方案1】:

    在 C 中,你不能这样做:

    typedef struct stru* pstru;
    
    typedef struct
    {
        int dni;
        pstru siguiente;
    } stru;
    

    您已经定义了一个未标记的结构类型并将其命名为stru,但typedef struct stru *pstru; 指的是不同的标记结构类型struct stru,这是不完整的。

    你可能需要:

    typedef struct stru *pstru;
    
    typedef struct stru
    {
        int dni;
        pstru siguiente;
    } stru;
    

    这应该编译没有问题。


    在 C++ 中,您不需要第二个 typedef;你可以简单地写:

    typedef struct stru *pstru;
    
    struct stru
    {
        int dni;
        pstru siguiente;
    };
    

    并且将定义类型stru

    【讨论】:

    • 感谢乔纳森的帮助。你是对的,现在它可以编译了。
    【解决方案2】:

    您正在做的事情会导致您的 alta 函数出现未定义的行为。

    首先,您尝试将stru ** 分配给stru *。由于类型不同,编译器不允许这样做。

    导致未定义行为的部分是您正在使用&amp;nnodo,即获取局部变量的地址并尝试存储它。这将不起作用,因为局部变量在堆栈上,并且当函数返回时,编译器会回收它的堆栈以供其他变量和函数使用。

    【讨论】:

    • 好的,我修复了 scanf 部分。现在,将 pstru alta(pstru ultimo) 作为函数定义和声明应该可以正常工作吗?因为我试过了,我仍然得到相同的编译器输出。
    • 谢谢,Joachim,由于新手的声誉,我无法为您的答案投票,但非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 2017-12-26
    相关资源
    最近更新 更多