开发环境: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);//栈尾删除一个成员
效果:完美运行,不再报错