程序崩溃的可能原因
Created|Updated
|Post Views:
程序的崩溃的可能由于:
擦拭调程序的代码(把赋值给野指针)
内存越界
数组下标越界和指针移动越界参数错误
1 | printf("%s %s's grade is %lf %lf %lf and your average is %lf\n", |
函数栈溢出
读取未赋值的变量
Related Articles
2020-03-17
关于makefile脚本的多文件编译
当我们想要编译执行多个文件的时候,我们会由于gcc a.c b.c c.c的命令太长而厌烦,而makefile脚本就解决这些问题。(用IDE不需要理会一些这些内容,只需要按下小三角就可以了) 写法makefile是由于这条gcc命令,而实现的。 我们有a.c b.c d.c (还有一些头文件。文件会有预处理指令#include "e.h") 12345678main: a.c b.o d.o //main(exe)的生成需要依赖:a.c b.o d.o gcc a.c b.o d.o -o main //(加Tab)做生成main的操作 b.o: b.c //b.o的生成需要b.c gcc -c b.c // -c 是要生成 .o文件d.o: d.c gcc -c d.cclean: rm *.o main //最后删除所有的.o文件,exe文件 操作 写makefile 在终端中,make就可以了生成c的可执行文件了 ./main执行文件 m...
2020-04-06
面向字符getc()和putc()
前言面向字符操作。 这两个函数类似于getchar()和puchar(‘ch’)。 区别在后面加多一个参数(FILE指针) 函数fopen() 函数声明:在stdio.h中 参数(文件名,读写等模式) 返回:文件指针FILE * fp; 文件指针并不指向实际的文件,它指向一个包含文件信息的数据对象,其中包含I/O函数所用的缓冲区信息。 getc()类似于getchar() 参数(FILE指针) 返回:文件中的一个字符 与getchar()函数类似,getchar()是从标准输入中获取字符。而,getc()是从指定文件中获取字符 putc()类似于putchar() 参数(一个字符,FILE指针) 作用将这个字符放入指定的文件中 exit() 函数声明:在stdlib.h头文件中 参数正常结束传递0,非正常传递非0值. 作用关闭所有打开文件,并结束程序 与return 不同的是:在main()以外的函数中调用exit()也能结束整个程序 fclose() 参数FILE指针 作用关闭指定文件 返回成功关闭:0不成功:EOF 示例将文件copy到其他...
2020-04-06
面向行fgets()和fputs()
前言该函数是面向行操作。不同于,getc()是处理字符 函数fgets() 作用把读入的内容添加到字符串中。 参数(字符串地址,字符个数,FILE指针) 返回值如果读到文件结尾(EOF),返回NULL如果还没有到EOF,返回之前传给它的字符串地址 范围 1.读取到第一个换行符后面。2.读到文件结尾3.读到字符个数-14.如果读到字符上限已经读完一行,则会把结尾的’\n’放在’\0’前面最后,在最后一个字符后面加’\0’ Don’t forget !字符串的大小是:字符个数+最后的空字符 fputs() 参数(字符串地址,FILE指针) fgets()保留了换行符,fputs()不会再添加换行符不同于puts()函数会在末尾添加换行符 strstr() 作用查找字符串中要查找的字符串 参数(被查找的字符串str1,需要的字符串str2) 返回值返回str1中str2的首位置 示例显示含有某个字符的一整行12345678910111213141516171819202122232425262728293031323334#include<stdio.h...
2020-03-31
动态内存与指针
了解函数 malloc()以字节为参数,以内存块的首字节地址为返回值。 free()以指针为参数,它只释放指针指针向的内存块例如:free(p);这时,p指向的内存没有了,可是p这个指针还存在 实例1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950#include <stdio.h>#include <stdlib.h>#include <ctype.h>#define SIZE 40char * * mal_ar(int n);int main(void){ int words, i; char * * st; printf("How many words do you wish to enter? "); scanf("%d", &words); getchar(); //滤掉回车 printf(...
2020-04-13
复杂的声明(指针)
int p; //这是一个普通的整型变量 int *p; //首先从P 处开始,先与*结合,所以说明P 是一个指针,然后再与int 结合,说明指针所指向的内容的类型为int 型.所以P是一个返回整型数据的指针 int p[3]; //首先从P 处开始,先与[]结合,说明P 是一个数组,然后与int 结合,说明数组里的元素是整型的,所以P 是一个由整型数据组成的数组 int *p[3]; //首先从P 处开始,先与[]结合,因为其优先级比*高,所以P 是一个数组,然后再与*结合,说明数组里的元素是指针类型,然后再与int 结合,说明指针所指向的内容的类型是整型的,所以P 是一个由返回整型数据的指针所组成的数组 int (*p)[3]; //首先从P 处开始,先与*结合,说明P 是一个指针然后再与[]结合(与"()"这步可以忽略,只是为了改变优先级),说明指针所指向的内容是一个数组,然后再与int 结合,说明数组里的元素是整型的.所以P 是一个指向由整型数据组成的数组的指针 int **p; //首先从P 开始,先与*结合,说是P 是一个指针,然后再与*结合,说明...
2020-03-15
存储类别
前言5种存储类别 存储类别说明符 auto extern static register内容 作用域 链接 存储期 存储类别可以是变量,还可以是函数 说明作用域(变量的使用范围) 程序中可访问标识符的区域 块作用域{}内的 123{ int x;} 没有{}的块for while if 文件作用域声明在块以外的区域 1234(static)int x;{} (又分为外部链接,和内部链接。区分它们看有没有static) 函数作用域 函数原型作用域int function(int x, int y);仅在此时有用 链接(访问范围) 外部链接可以在不同文件中访问他(但访问时要加上extern) 内部链接可以在一个翻译单元内访问 编译器源代码文件和所有的头文件都看成一个包含信息的单独文件,而这个文件就是翻译单元。每个翻译单元均对应一个源代码文件和它所包含的文件。 无链接具有块作用域,函数作用域,函数原型作用域的变量都是无链接变量 存储期(使用时间) 静态存储期在程序执行期间一直存在 动态存储期可以主动控制 自动存储...
