程序在内存中是分段保存的。
代码段: 用来保存所有语句 不可修改
全局段: 用来保存全局变量和静态变量 大小不随程序的运行而改变
栈:先进后出 大小随程序运行变化 栈里为每个函数每次运行分配一个私有区域
每次函数运行结束后他的私有区域被收回 局部变量放在栈里
堆:动态分配的数据 就是在程序运行中临时决定是否使用
ASCII码为0 的字符用’\0‘ 表示 他用来表示一段文字的结束位置。这写存储位置叫字符串
字符串开始位置使用第一个字符的存储位置表示
C语言中可以使用char* 指针表示字符串
字符串字面值是实现字符串的一种方法
编译器在编译时自动给字面值加’\0‘结尾字符 把字符串字面值替换成首字符地址
在程序运行时字符串字面值被存储在专门的段落里 这个段落是不可以被修改的
字符串数组里面的值是可以修改的
并列的多个字符串字面值在编译时会被合并一个字面值
C语言中也可以使用字符数组表示字符串 与指针的区别 不会自动想数组中加'\0'字符
可以使用字符串字面值给字符数组进行初始化 如果使用字符串给字符数组初始化
字面值会自动加上’\0‘
字符数组在内存中存放的段落不确定但一定是可以被修改的
strlen 获得字符串的有效长度
strcat 把一个字符串追加到另一个字符串的后面 返回值表示合并后的结果 可能越界
strncat 功能类似strcat但不会越界
strcmp 比较两个字符串是否相等 前一个大返回1 相等返回0 否则返回-1
strcpy 用来把一个1字符串的内容复制到另一个字符串中 返回值就是这个字符串的首地址
这个函数可能造成数组越界 strcpy(buf,"def");这样buf中的内容会被清空
可以使用%s做占位符对字符串进行读取打印操作 使用scanf读字符串会出现错误
fgets函数可以从任何文件读字符串 linux所有设备都是文件 键盘屏幕都可以用文件表示
char *fgets(char *s, int size, FILE *stream);
三个参数:
字符数组名称 负责从文件中读取字符串到数组中
数组中存储位置的个数
要读取的文件 stdin表示从键盘输入
scanf("%*[^\n]");
scanf("%*c");
清空缓冲区
每次使用fgets读字符串后都要处理输入缓冲区的垃圾数据
练习:
编写一个模拟登陆程序
用户名admin 密码123456 给用户三次机会都失败了提醒失败
二维字符数组可以用来记录多个相关字符串 但是不够灵活
指针数组(就是一个数组包含多个指针,每个指针制定一个字符串)
指针数组名称可以赋值给二级指针 char* argv[] 等同于char** argv
主函数也有形参 第二个形参表示一组相关字符串 第一个形参表示字符串个数
int main(int argc,char* argv[])
sizeof是占用内存字节数 strlen 是有效字符串长度
指针数组:
指针数组本质就是存放指针的数组
数组指针本质是存放数组的指针
练习:
1、编写mystrcat函数 要求使用指针
char *fgets(char *s, int size, FILE *stream);
2、编写两个程序把用户输入包含多个成绩的字符串拆分成多个字符串并记录在
二维数组或者指针数组中 把结果打印在屏幕上
核心已转储:
对空地址进行比纳凉的赋值
对野指针进行变量的赋值
对空指针进行变量的读取
在程序运行时字符串字面值被存储在专门的段落里 这个段落是不可以被修改的
用malloc分配内存时 不能释放一部分 也不能释放两次 都会出现核心转储
void *malloc(size_t size);
void free(void *ptr);
void *calloc(size_t nmemb, size_t size);
void *realloc(void *ptr, size_t size);
关于字符串的赋值:
指向只读区的只能用 = 改值
字符数组格式的只能用strcpy()
指向堆的也用strcpy()
用sbrk分配内存 用free释放内存会出现段错误
代码段: 用来保存所有语句 不可修改
全局段: 用来保存全局变量和静态变量 大小不随程序的运行而改变
栈:先进后出 大小随程序运行变化 栈里为每个函数每次运行分配一个私有区域
每次函数运行结束后他的私有区域被收回 局部变量放在栈里
堆:动态分配的数据 就是在程序运行中临时决定是否使用
ASCII码为0 的字符用’\0‘ 表示 他用来表示一段文字的结束位置。这写存储位置叫字符串
字符串开始位置使用第一个字符的存储位置表示
C语言中可以使用char* 指针表示字符串
字符串字面值是实现字符串的一种方法
编译器在编译时自动给字面值加’\0‘结尾字符 把字符串字面值替换成首字符地址
在程序运行时字符串字面值被存储在专门的段落里 这个段落是不可以被修改的
字符串数组里面的值是可以修改的
并列的多个字符串字面值在编译时会被合并一个字面值
C语言中也可以使用字符数组表示字符串 与指针的区别 不会自动想数组中加'\0'字符
可以使用字符串字面值给字符数组进行初始化 如果使用字符串给字符数组初始化
字面值会自动加上’\0‘
字符数组在内存中存放的段落不确定但一定是可以被修改的
strlen 获得字符串的有效长度
strcat 把一个字符串追加到另一个字符串的后面 返回值表示合并后的结果 可能越界
strncat 功能类似strcat但不会越界
strcmp 比较两个字符串是否相等 前一个大返回1 相等返回0 否则返回-1
strcpy 用来把一个1字符串的内容复制到另一个字符串中 返回值就是这个字符串的首地址
这个函数可能造成数组越界 strcpy(buf,"def");这样buf中的内容会被清空
可以使用%s做占位符对字符串进行读取打印操作 使用scanf读字符串会出现错误
fgets函数可以从任何文件读字符串 linux所有设备都是文件 键盘屏幕都可以用文件表示
char *fgets(char *s, int size, FILE *stream);
三个参数:
字符数组名称 负责从文件中读取字符串到数组中
数组中存储位置的个数
要读取的文件 stdin表示从键盘输入
scanf("%*[^\n]");
scanf("%*c");
清空缓冲区
每次使用fgets读字符串后都要处理输入缓冲区的垃圾数据
练习:
编写一个模拟登陆程序
用户名admin 密码123456 给用户三次机会都失败了提醒失败
二维字符数组可以用来记录多个相关字符串 但是不够灵活
指针数组(就是一个数组包含多个指针,每个指针制定一个字符串)
指针数组名称可以赋值给二级指针 char* argv[] 等同于char** argv
主函数也有形参 第二个形参表示一组相关字符串 第一个形参表示字符串个数
int main(int argc,char* argv[])
sizeof是占用内存字节数 strlen 是有效字符串长度
指针数组:
指针数组本质就是存放指针的数组
数组指针本质是存放数组的指针
练习:
1、编写mystrcat函数 要求使用指针
char *fgets(char *s, int size, FILE *stream);
2、编写两个程序把用户输入包含多个成绩的字符串拆分成多个字符串并记录在
二维数组或者指针数组中 把结果打印在屏幕上
核心已转储:
对空地址进行比纳凉的赋值
对野指针进行变量的赋值
对空指针进行变量的读取
在程序运行时字符串字面值被存储在专门的段落里 这个段落是不可以被修改的
用malloc分配内存时 不能释放一部分 也不能释放两次 都会出现核心转储
void *malloc(size_t size);
void free(void *ptr);
void *calloc(size_t nmemb, size_t size);
void *realloc(void *ptr, size_t size);
关于字符串的赋值:
指向只读区的只能用 = 改值
字符数组格式的只能用strcpy()
指向堆的也用strcpy()
用sbrk分配内存 用free释放内存会出现段错误