***段错误的原因:
(1)访问了不该访问的空间(空指针或者野指针)
(2)越界
(3)修改了常量区的内容***
针对段错误处理方法:
GDB调试:
流程:
(1)生成带有调试信息的文件
gcc -g test.c -o test
(2)进入该文件中
gdb test
(3)设置断点
b 行号/函数名
(4)让程序运行起来
r
(5)单步调试:
n (不进入子函数,但是函数调用的整个结果会被显示出来)/ s (此时子函数会进入,进入子函数内部进行每一行单步调试)
(6)如果看到(segementation default…)
(7)q (quit) 退出调试环境
1,函数: 功能单一的模块
函数的分类:
(1)库函数:已经封装好的函数,只留给调用者一个接口,然后调用者只需要正确传参使用即可
(2)自定义函数:用户自己定义的接口,用来实现特定的功能
int main(int argc,const char *argv[])
{
return 0;
}
子函数的定义:
格式:
数据类型1 函数名(数据类型2 变量名1,数据类型3 变量名2。。。。。)
{
函数体//代码的实现过程
返回值;
}
分析:
数据类型1:返回值类型,如果没有返回值,则写成void
数据类型2:形式参数1的类型
变量名1:形参名1
数据类型3:形式参数2的类型
变量名2:形参名2
返回值:可有可有
2,函数的声明
写法:直接拷贝函数头,在其末尾添加分号即可
函数声明检查的是语法错误(参数的个数以及类型是否匹配)
注意:声明中的形参名可以省略不写。(不起任何作用)
总结:
(1)调用函数时,实参可以为常量,变量,表达式均可
(2)实参和形参的个数以及类型均要匹配
(3)形参和实参可以重名(作用域不同)
(4)形参只有被调用时,才为其分配空间,当调用完成后,则被释放掉(形参相当于局部变量,存储在栈区)
(5)实参和形参是两块独立的内存空间
3,指针作为参数传参
解决问题:当需要通过子函数引起实参值改变的时候,需要将实参的地址作为参数传递给形参
因为地址时唯一的,通过操作地址(指针),就是在操作实参的那片空间。
传参的形式:
(1)值传递
(2)址传递
4,一维数组的传参
数组:
本质:连续的内存空间
操作数组就是操作空间
对于操作空间,需要知道什么?
(1)从哪里开始? ----》首地址
(2)什么时候终止? ------》元素个数
作业:
1,定义一个带有空格的字符串,实现删除所有空格(子函数实现)
#include <stdio.h>
void delete_str_func(char *pStr);
void delete_str_func(char *pStr)
{
//入参判断
if(NULL == pStr)
{
printf("空指针!\n");
return;
}
//定义一个指针指向数组的首元素
char *p = pStr;
//遍历字符串
while(*p)
{
//判断是否为空格
if(' ' == *p)
{
//定义一个指针,接替此时p的指向
char *q = p;
while(*q)
{
*q = *(q+1);
q++;
}
}
else
{
p++;
}
}
}
int main(int argc, const char *argv[])
{
//定义一个数组
char str[20] = {'\0'};
printf("请输入一个带有空格的字符串:\n");
gets(str);
printf("删除之前的字符串: str =%s\n",str);
delete_str_func(str);
printf("删除之后的字符串: str =%s\n",str);
return 0;
}
2,定义一个带有空格的字符串,实现将所有空格替换为%20(子函数实现)
#include <stdio.h>
void change_str_func(char *pStr)
{
if(NULL == pStr)
{
printf("NULL_ERROR!\n");
return;
}
//定义一个指针指向该字符串的首元素
char *p = pStr;
//定义一个变量,保存空格的个数
int blank = 0;
//定义一个变量,保存字符串的旧长度
int len = 0;
//遍历字符串
while(*p)
{
if(' ' == *p)
{
blank++;
}
len++;
p++;
}
//定义一个变量,保存替换之后的字符串新长度
int all_len = len + (blank * 2);
//定义两个变量,分别保存新旧字符串的最后一个有效字符的下标
int j = all_len-1;
int i = len-1;
//恢复p的指向带首地址
p = pStr;
//从旧字符串最后一个元素开始往前遍历
while(i >= 0)
{
if( ' ' == *(p+i) )
{
//将该位置以及前面两个位置用%20进行替换
*(p+j) = '0';
*(p+j-1) = '2';
*(p+j-2) = '%';
j -= 3;//j = j -3;
i--;
}
else
{
*(p+j) = *(p+i);
j -= 1;
i--;
}
}
}
int main(int argc, const char *argv[])
{
//定义一个字符串
char str[100] = {0};
printf("请输入一个带有空格的字符串:\n");
gets(str);
printf("替换之前的字符串: str =%s\n",str);
change_str_func(str);
printf("替换之后的字符串: str =%s\n",str);
return 0;
}