c语言 - 列表 *下一个指针未指向另一个节点,返回3221226356



我正在一个函数中读取。geo文件,将其内容保存在链表中。问题在于当我填充一个节点并必须创建另一个节点时,然后使下一个指针指向新节点。

函数调用一个空链表(ola),它的*next指针指向null。

#include <stdio.h>
#include <stdlib.h>
typedef struct cel{
char *nome;
char *borda;
char *meio;
double x;
double y;

double lar;
double alt; 

struct cel * next;

} celula;
void ler(celula * ola){
celula * aux = ola;
char comando[30];
char borda[20] = "transparent";
char meio[20] = "transparent";
FILE *fp;
fp = fopen("c-rects.geo", "r");
int b;
double i;

for (b=0; b<50;b++){    
fscanf(fp, "%s", comando);
if(!strcmp(comando, "nx")){
fscanf(fp, "%lf", &i);
fscanf(fp, "%lf", &i);
fscanf(fp, "%lf", &i);
fscanf(fp, "%lf", &i);
fscanf(fp, "%lf", &i);
}   
else if(!strcmp(comando, "r")){
fscanf(fp, "%s", aux->nome);
aux->borda = borda;
aux->meio = meio;
fscanf(fp, "%lf", &aux->x);
fscanf(fp, "%lf", &aux->x);
fscanf(fp, "%lf", &aux->y);
fscanf(fp, "%lf", &aux->lar);
fscanf(fp, "%lf", &aux->alt);

}
else if(!strcmp(comando, "cc")){
fscanf(fp, "%s", meio);
}
else if(!strcmp(comando, "cp")){
fscanf(fp, "%s", borda);
}

aux->next = (celula *) malloc(sizeof(celula));
aux = aux->next;
aux->next = NULL;
}

}

示例输入:

nx 110 1000 1000 1000 1000

cp tan cc gold 
r r_269.00-686.00-1.0-15.0 269.000000 686.000000 1.000000 15.000000 

名称应为r_269.00-686.00-1.0-15.0

Borda:黄金

Meio:棕褐色

X: 269.000000Y:

686.000000守护神:1.000000

alt: 15.000000

应该可以正常工作,不知道为什么只有在这种情况下它不能工作。

可能有几个问题。但是并不是所有的代码都显示出来,main丢失了。代码中典型的主要问题

表示没有分配内存。确保正确分配内存给指针(malloc)。注意:ler子程序中为局部变量分配的内存在ler子程序剩余后会丢失。也要注意为结构cel分配内存,例如在main例程中。您需要遍历整个代码来检查这一点。(然后您还可以阅读有关空闲内存的信息,但这里可能不需要它,命令free)

一个可能的步骤如下所示:cel已经包括nome,bordameio的内存。但这还不是全部,您需要真正理解问题并在整个代码中修复它。

typedef struct cel{
char nome[30];
char borda[30];
char meio[30];
double x;
double y;

double lar;
double alt; 

struct cel *next;

} celula;

有一些问题…

meioborda是函数作用域变量。当将它们设置为celula实例时,我们需要使用strdup

同理,对于nome

我们可以把这些尺寸做大一点。

仅为r命令分配malloc实例。否则,会有大量的空/垃圾项。

最好让ler分配并返回一个指向链表的指针,所以我们应该改变原型。

ler中,我们需要fclose(fp)

下面是一些重构的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct cel {
char *nome;
char *borda;
char *meio;
double x;
double y;
double lar;
double alt;
struct cel *next;
} celula;
celula *
ler(void)
{
celula *ola = NULL;
celula *prev = NULL;
celula *aux = NULL;
char comando[30];
char borda[200] = "transparent";
char meio[200] = "transparent";
char nome[200];
FILE *fp;
fp = fopen("c-rects.geo", "r");
int b;
double i;
for (b = 0; b < 50; b++) {
if (fscanf(fp, "%s", comando) != 1)
break;
if (!strcmp(comando, "nx")) {
fscanf(fp, "%lf", &i);
fscanf(fp, "%lf", &i);
fscanf(fp, "%lf", &i);
fscanf(fp, "%lf", &i);
fscanf(fp, "%lf", &i);
}
else if (!strcmp(comando, "r")) {
prev = aux;
aux = malloc(sizeof(*aux));
aux->next = NULL;
if (ola == NULL)
ola = aux;
if (prev != NULL)
prev->next = aux;
aux->borda = strdup(borda);
aux->meio = strdup(meio);
fscanf(fp, "%s", nome);
aux->nome = strdup(nome);
fscanf(fp, "%lf", &aux->x);
fscanf(fp, "%lf", &aux->x);
fscanf(fp, "%lf", &aux->y);
fscanf(fp, "%lf", &aux->lar);
fscanf(fp, "%lf", &aux->alt);
}
else if (!strcmp(comando, "cc")) {
fscanf(fp, "%s", meio);
}
else if (!strcmp(comando, "cp")) {
fscanf(fp, "%s", borda);
}
}
fclose(fp);
return ola;
}

相关内容

  • 没有找到相关文章

最新更新