复习:
堆内存管理:
C语言中没有管理堆内存的语句,只能使用标准库中的函数
#include <stdlib.h>
void malloc(size_t size);
功能:从堆内存中申请一块连续的大小为size个字节的内存
返回值:内存块的首地址
int p = (int*)malloc(4);
注意:void* 在C++编译器中不能自动类型转换为其它类型,如果想要让代码也能在c++中兼容,需要强制类型转换
void free(void *ptr);
功能:释放一块堆内存
ptr:要释放的堆内存的首地址
注意:可以释放NULL,但是不能连续释放其他地址
常见的笔试面试题:
1、堆内存与栈内存的区别
定义、大小、使用、安全性
2、堆内存越界的后果
1、破坏malloc的维护信息,导致接下去malloc和free出差
2、超过33页会产生段错误
3、其余可能出现脏数据
3、什么是内存泄漏?如何定位内存泄漏
由于业务逻辑出错或者粗心大意导致已经使用完毕的堆内存没有及时释放,当再次需要使用时又重新申请堆内存,又没有释放,长期以往导致可用的堆内存越来越少,系统越来越慢甚至系统崩溃,这种情况叫做内存泄漏
1、window下查看任务管理器,Linux通过ps -aux查看内存使用情况
2、通过类似于matrace代码分析工具,分析代码是否有没有释放的内存
3、封装malloc、free记录调用信息到日志中
4、什么是内存碎片?如何减少内存碎片
已经释放但是无法使用的内存叫做内存碎片,是由于申请和释放的时间、大小不协调导致的
1、尽量使用栈内存
2、尽量申请大块内存自己管理
3、不要频繁地申请释放内存
字符串:
字符:
在计算机中字符是以整数形式存储的,当需要显示时根据ASCII表中的对应关系显示出相应的符号或图案
‘\0’ 0
‘0’ 48
‘A’ 65
‘a’ 97
串:
是一种数据结构,是由一组连续的相同类型若干个数据组成,末尾有一个结束标志
对这种数据结构进行处理都是批量性处理,从开头位置到结束标志为止
字符串:
由字符组成的串型结构,它的结束标志是’\0’
字符串的输入:
char str[256];
scanf %c
scanf %s 地址
注意:不能接收空格
char *gets(char *s);
功能:输入字符串到s中,可以接受空格
返回值:链式调用(把一个函数的返回值,作为另一个函数的参数)
char *fgets(char *s, int size, stdin);
功能:可以设置输入的字符串的长度为size-1,超出长度时会在末尾给'\0'预留位置,超出部分会不接收
注意:如果长度不足size-1,则会接收最后输入的'\n'
字符串的输出
printf %s 地址
int puts(const char *s);
功能:输出一个字符串,会在末尾自动打印一个'\n'
返回值:成功输出的字符个数
字符串的存在形式:
字符数组: char str[10] = {‘a’,‘b’,‘c’,…};
由char类型组成的数组,一定要为’\0’预留位置
赋值麻烦
使用的是栈内存,数据是可以修改的
字符串字面值:
"由双引号包含的若干个字符" "hello world"
在末尾隐藏了一个'\0'
字符串字面值就是以地址形式存在的,数据储存在代码段,如果修改则会产生段错误
char* str = "字符串字面值";
sizeof("strstr") 结果=字符个数+1
两个一模一样的字符串字面值在代码段中只会存在一份
常用方式:
字符数组[] = "字符串字面值";
会自动给'\0'预留位置
赋值完成后字符串会存在有两份,一份存储在代码段,另一份存储在栈内存(可以修改)
作业:
1、实现一个函数,判读字符串是否是回文串 "abcba"
2、实现一个函数,把一个数字字符串转换为整数 "12345" 12345
3、实现一个函数,把一个字符串逆序