c - 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);
}
解决方案
本声明
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>
。所以删除它。
推荐阅读
- c++ - OpenCV - 为什么光流不适用于出队
? - java - Java中的SSLSocketFactory,LDAP网络连接
- c# - 如果财产被声明为私有怎么办?如何在 C# 中调用它?
- sql - 获取特定等级之间的有序记录
- javascript - 如何在javascript中返回整数乘以3的数组?
- r - R:操作列表名称
- r - 如何防止虚线参数(部分)匹配按位置调用的关键字参数?
- ansible - Ansible:将 yaml 文件从远程位置读取到变量中
- vue.js - Vuetify v-btn 组件与 nuxt 属性不同
- c# - Telerik for Blazor 下拉选择事件未更新网格中的数据