首页 > 解决方案 > C:操作符'->'的问题,编译但返回错误。有main.c和.h、.c文件

问题描述

我是该网站的新手。我使用代码块。我正在使用 C 语言中的列表,我必须创建一个具有多个函数的程序,但它有一个头文件来声明它们,另一个 .c 文件来实现它们,然后从 main.c 调用所有内容。当我编译代码时出现问题,插入 n 然后在进入 for 循环后立即按 enter 会出错。我相信'->'运算符有问题。请问你能帮帮我吗?

    //main.c
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <list.h>
    
    int main()
    {
        struct element *list;
        list = create_list();
    
        return 0;
    }
    //list.h
    
    #ifndef LIST_H_INCLUDED
    #define LIST_H_INCLUDED
    
    
    
    #endif // LIST_H_INCLUDED
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    
    struct element {
       int number;
       struct element *pointer;
    };
    
    struct element *create_list();
    //list.c
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    #include <list.h>
    
    int n = 0;
    
    struct element *create_list() {
    
       struct element *p, *ptr;
       int i;
    
       printf("Insert the number of element of the list... ");
       scanf("%d", &n);
    
       if (n==0) {
    
        p = NULL;
    
       } else {
    
        p = (struct element*)malloc(sizeof(struct element));
        p->number = 0;
        for(i=1; i<=n; i++) {
    
            //printf("ciao\n");
            ptr->pointer = (struct element *)malloc(sizeof(struct element));
            ptr = ptr->pointer;
            ptr->number = i;
        }
    
        ptr->pointer = NULL;
       }
    
    return(p);
    }

标签: clistinitializationstructuresingly-linked-list

解决方案


本声明

struct element *p, *ptr;

声明两个具有自动存储持续时间的变量,它们具有不确定的值,因为它们没有被显式初始化。

所以在这个for循环中

    for(i=1; i<=n; i++) {

        //printf("ciao\n");
        ptr->pointer = (struct element *)malloc(sizeof(struct element));
        ptr = ptr->pointer;
        ptr->number = i;
    }

您正在使用未初始化的指针ptr试图访问pointer不存在的对象的数据成员。

似乎在循环之前您的意思是以下分配

    p = (struct element*)malloc(sizeof(struct element));
    p->number = 0;
    ptr = p;  // <===
    for(i=1; i<=n; i++) {

        //printf("ciao\n");
        ptr->pointer = (struct element *)malloc(sizeof(struct element));
        ptr = ptr->pointer;
        ptr->number = i;
    }

请注意,将全局变量 n 声明为有符号整数类型而不是无符号整数类型是一个坏主意。

如果用户输入一个负数,该函数将返回一个指向值为 0 的节点的指针的意外结果。

还将声明放在和之间的标题#ifndef#endif

#ifndef LIST_H_INCLUDED
#define LIST_H_INCLUDED

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

struct element {
   int number;
   struct element *pointer;
};

struct element *create_list();    

#endif // LIST_H_INCLUDED

并且标头malloc.h不是标准的 C 标头。内存分配函数在标题中<stdlib.h>。您的程序应该在没有标题的情况下工作<malloc.h>。所以删除它。


推荐阅读