C语言Malloc函数的使用

开发环境:Windows平台Visual Studio2022

编程目标:C primer plus 第十七章编程题第五题简单版本,实现一个项是整型的栈抽象数据类型

初始代码:

//头文件//
#include<stdio.h>
#include<stdbool.h>
#define max 100
typedef int Item;
typedef struct member{
	Item item;
	struct member * next;
}Member;
typedef Member* Stack;//指向栈尾的指针
void InitializeStack(Stack * pq);//初始化栈
bool StackIsEmpty(Stack * pq);//检测栈是否为空
bool Enstack(Item item,Stack* pq);//栈尾添加一个成员
bool Destack(Stack* pq);//栈尾删除一个成员
//接口函数的定义//
#include "stack.h"
void InitializeStack( Stack* pq){
	*pq = NULL;
}
bool StackIsEmpty(const Stack* pq) {
	if (*pq == NULL)
		return true;
	else
		return false;
}
bool Enstack(Item source,Stack* pq){
	Member* temp1 = (Member*)malloc(sizeof(Member));
	Member* temp2=*pq;
	if (temp1 == NULL)
		return false;
	temp1->next = NULL;
	temp1->item =source;
    if (temp2 == NULL)//如果是第一次放入成员
	{
	
	temp1->next = NULL;
	(*pq)= temp1;
	}
	else//如果不是第一个成员
	{
		
		temp1->next=(*pq);
		(*pq) = temp1;

	}
	return true;
}
bool Destack(Stack* pq) {
    
	Member* temp = *pq;
	(*pq) = (*pq)->next;
	free(temp);
	return true;
}
//主驱动函数//
#include"stack.h"
int main(void){
	Stack line;
	char ch;
	Item temp;
	InitializeStack(&line);
	printf("a输入,b删除,q退出\n");
	while ((ch = getchar()) != 'q') {
		while (getchar() != '\n')
			continue;
		if (ch == 'a')
		{
			printf("输入数字\n");
			scanf_s("%d", &temp);
			while (getchar() != '\n');
			Enstack(temp, &line);
		}
		else if (ch == 'b')
			Destack(&line);
	printf("a输入,b删除,q退出\n");
     }

}

运行效果:报错,报错内容是“引发的异常: 0xC0000005: 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突”,多次检查代码逻辑,绝无问题,百思不得其解。

解决方法:通过屏蔽代码行定位问题,最后发现是malloc函数的问题,上网搜集malloc函数有关资料,在帖子:C语言指针之二malloc的用法及详解_修炼之路的博客-CSDN博客_malloc函数的用法

中找到了答案,即"使用malloc函数之前要调用一个库malloc.h(或者stdlib.h)。"

改进方案:在头文件中调用malloc.h库

#include<malloc.h>
#include<stdio.h>
#include<stdbool.h>
#define max 100
typedef int Item;
typedef struct member{
	Item item;
	struct member * next;
}Member;
typedef Member* Stack;//指向栈尾的指针
void InitializeStack(Stack * pq);//初始化栈
bool StackIsEmpty(Stack * pq);//检测栈是否为空
bool Enstack(Item item,Stack* pq);//栈尾添加一个成员
bool Destack(Stack* pq);//栈尾删除一个成员

效果:完美运行,不再报错

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值