栈和函数返回
堆栈概念
定义:我们将所有变量使用的内存称为栈,而将为分配的内存区称为堆。举例说明比如main函数的局部变量(argc和argv)都在栈中。使用malloc()是动态分配是在堆中。
(个人理解:因为main函数中的两个变量已经定义,malloc()函数是对未分配内存进行申请)
- 堆未已分配内存
在未分配的内存区域,我们可以使用块为单位请求使用。 - 栈:-已分配内存
只能由分配了这块的原始代码使用。 - 堆栈:平时大家说的“”堆栈“”主要是指 栈 (已经分配)
- 元素:栈中的数据成为元素。
- 入栈:push,只允许向栈中压入元素。
- 出栈:pop,从栈中删除一个元素。
- 先进后出(Last in,frist out,LIFO)
4种形式的栈
个人理解:由于这版名词说明的有点专业,本人就是喜欢庸俗的表达。(只详细介绍第一种)
- “满”递增堆栈:即堆栈从高地址向下增长,SP指向储存单元保存的最后入栈的数据。
“空”的话指SP指向的储存单元将保存下个入栈的数据。
写一个可变数组
需求分析
- 初始化函数
- 设置数组大小函数
- 获取数组长度函数
- 获取数组一个数据函数
- 设置数据内一个数据函数
- 清除函数
结构体定义
struct _IntArray{
int *pBuffer;
size_t count;
};
定义指针和计数变量
函数编写以及详解(.c)
#include <malloc.h>
#include "stackadt.h"
struct _IntArray{
int *pBuffer;
size_t count;
};
初始化函数
IntArray * IA_ini()
{
IntArray *pIntArray = malloc(sizeof(IntArray));
pIntArray -> pBuffer = 0;
pIntArray -> count = 0;
return pIntArray;
}
清除函数
void IA_cleanup(IntArray *pThis)
{
free(pThis -> pBuffer);
pThis -> pBuffer = 0;
free(pThis);
}
设置数组大小函数
void IA_setSize(IntArray *pThis, size_t size)
{
pThis -> count = size;
pThis -> pBuffer = (int *)realloc(pThis -> pBuffer, size * sizeof(int));
}
这边使用realloc函数
相当于重新申请内存
获取数组长度函数
size_t IA_getSize(IntArray *pThis)
{
return pThis -> count;
}
设置数据内一个数据函数
bool IA_setElem(IntArray *pThis, size_t index, int value)
{
if (index >= pThis -> count) return false;
pThis -> pBuffer[index] = value;
return true;
}
获取数组一个数据函数
bool IA_getElem(IntArray *pThis, size_t index, int *pValue)
{
if (index >= pThis -> count) return false;
*pValue = pThis -> pBuffer[index];
return true;
}
.h文件
#ifndef STACKADT_H
#define STACKADT_H
#include <stdbool.h>
#include <stddef.h>
typedef struct _IntArray IntArray;
IntArray * IA_ini(); // ?? IntArray
void IA_cleanup(IntArray *pThis); // ?? IntArray
void IA_setSize(IntArray *pThis, size_t size); // ????????
size_t IA_getSize(IntArray *pThis); // ????????
bool IA_setElem(IntArray *pThis, size_t index, int value); // ??????
bool IA_getElem(IntArray *pThis, size_t index, int *pValue); // ??????
#endif
结果分析
#include <stdio.h>
#include "stackadt.h"
int main()
{
IntArray *pIntArray;
const size_t count = 10;
int temp = 0;
int i = 0;
pIntArray=IA_ini();
IA_setSize(pIntArray, count);
for ( i = 0; i < count; i++)
IA_setElem(pIntArray, i, (int)i * 2);
for ( i = 0; i < count; i++)
{
IA_getElem(pIntArray, i, &temp);
printf("%d ", temp);
}
IA_cleanup(pIntArray);
return 0;
}