它不编译,我不知道我到底做错了什么。当我试着做:
(ultimo->siguiente)=nnodo; 编译器不允许我。也不起作用:
scanf("%d", &(nnodo->dni));PD: baja和modif函数仍未完成,但它们不应与主程序产生任何冲突。
编译器输出(Visual 2010):
错误2错误C2037:“siguiente”的左侧指定未定义的结构/联合'stru‘c:\documents和设置\emiliano\桌面\asdc.c 52 1 abm
错误3错误C2037:左边的'dni‘指定未定义的结构/联合'stru’c:\文档和设置\emiliano\桌面\asdc.c551abm
4 IntelliSense:指向不完整类类型的指针是不允许的c:\文档和设置\emiliano\桌面\asdc.c 52 3 abm
5 IntelliSense:指向不完整类类型的指针是不允许的c:\文档和设置\emiliano\桌面\asdc.c 55 15 abm
我想我的打字正确,但我真的不知道。
#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;
}发布于 2012-11-19 06:06:30
在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类型。
发布于 2012-11-19 02:52:22
您正在做一些导致alta函数中未定义的行为的事情。
首先,您尝试将stru **分配给stru *。这是编译器不允许的,因为类型不同。
导致未定义行为的部分是使用&nnodo,即获取局部变量的地址并尝试存储它。这将无法工作,因为局部变量在堆栈上,并且当一个函数返回它的堆栈时,编译器会回收它的堆栈,以供其他变量和函数使用。
https://stackoverflow.com/questions/13446992
复制相似问题