gpt4 book ai didi

c - malloc 不适用于列表的第二个元素

转载 作者:行者123 更新时间:2023-11-30 18:44:30 26 4
gpt4 key购买 nike

该函数应该创建一个结构体的链接列表,我在调试器中看到它为第一个元素分配内存,但在为第二个元素分配内存期间程序崩溃了。

struct Tipologia{
int mq;
int prezzo;
int n;
char descrizione[100];
};

struct Nodo{
struct Tipologia t;
struct Nodo *next;
};

typedef struct Nodo* NODO;

struct Tipologia creaTipologia(){
struct Tipologia t;
printf("MQ?\n");
scanf("%d", &(t.mq));
printf("PREZZO?\n");
scanf("%d", &(t.prezzo));
printf("DISPONIBILI?\n");
scanf("%d", &(t.n));
printf("DESCRIZIONE?\n");
int c;
while ( (c = getc(stdin)) != EOF && c != '\n');
fgets((t.descrizione), 100, stdin);
return t;
}

NODO costruisciPalazzo(){
int continua;
NODO h= NULL;
printf("VUOI COSTRUIRE UN APPARTAMENTO? 1 SI, 0 NO\n");
scanf("%d", &continua);
if(continua){
NODO n= malloc(sizeof(NODO));
h= n;
n->t= creaTipologia();
n->next= NULL;
printf("VUOI COSTRUIRE UN APPARTAMENTO? 1 SI, 0 NO\n");
scanf("%d", &continua);
while(continua){
NODO nodo= malloc(sizeof(NODO));
n->next= nodo;
n= nodo;
n->t= creaTipologia();
printf("VUOI COSTRUIRE UN APPARTAMENTO? 1 SI, 0 NO\n");
scanf("%d", &continua);
}
n->next= NULL;
}
return h;
}

我一直遵循教授的指示,但它不断崩溃,没有给出任何错误来解释实际发生的情况。这似乎对我的同学有用,但我们不知道问题出在哪里。请帮忙

最佳答案

问题在于您使用的 typedef 隐藏了 NODO 是指针的事实。这很糟糕,因为它会造成困惑的情况,您期望类型具有一定的大小并与一定的语法一起使用,但实际上它是完全不同的东西。

例如,您必须这样做:

h= n;
n->t= creaTipologia();
n->next= NULL;

令人困惑的是,hn 都没有显式声明为指针,但您必须使用箭头表示法。

我的建议是,您要么完全删除 typedef 并在代码中使用 struct nodo,或者至少从 typedef 中删除指针>。为了保持一致性,对其他结构执行相同的操作:

typedef struct {
int mq;
int prezzo;
int n;
char descrizione[100];
} TIPOLOGIA;

typedef struct Nodo {
TIPOLOGIA t;
struct Nodo *next;
} NODO;

您还可以使用对象作为其大小的引用来简化 malloc。例如:

NODO *h = malloc(sizeof *h);

这避免了在调用 malloc 时指定 h 的类型。也更适合重用。

关于c - malloc 不适用于列表的第二个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57828912/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com