1. ifndef/define/endif的作用:避免头文件被重复引用。
2.堆栈溢出主要的原因是:
(1)函数调用层次太深。函数递归调用时,系统要在栈中不断保存函数调用时的现场和产生的变量,如果递归调用太深,就会造成栈溢出,这时递归无法返回。再有,当函数调用层次过深时也可能导致栈无法容纳这些调用的返回地址而造成栈溢出。
(2)动态申请空间使用之后没有释放。由于C语言中没有垃圾资源自动回收机制,因此,需要程序主动释放已经不再使用的动态地址空间。申请的动态空间使用的是堆空间,动态空间使用不会造成堆溢出。
(3)数组访问越界。C语言没有提供数组下标越界检查,如果在程序中出现数组下标访问超出数组范围,在运行过程中可能会内存访问错误。
(4)指针非法访问。指针保存了一个非法的地址,通过这样的指针访问所指向的地址时会产生内存访问错误。
3.static全局变量与普通全局变量的区别是:static全局变量只初始化一次,防止在其他文件中被引用
static局部变量与普通局部变量的区别是:static局部变量只被初始化一次,下一次一局上一次结果值
static函数与普通函数的区别是:static函数在内存中只有一份,普通函数在每个被调用中维持一份复制品.
4.strcmp函数
//模拟实现strcmp函数
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 && str2);
while (*str1 == * str)
{
if ( *str1 == '\0')
{
return 0;
}
str1++;
str2++;
}
return *str1 - *str2;
}
int main(void)
{
//strcmp比较的是对应位置上的字符大小
char ch1[10] = { 0 };
char ch2[10] = { 0 };
scanf("%s", ch1);
scanf("%s", ch2);
printf("%d\n", my_strcmp(ch1, ch2));
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>//strcmp()的头文件
int main()
{
char str1[10]="hahahaha";
char * p1=str1;//指针p1指向这个字符串的首地址
char str2[10]="hahahaha";
char str3[10]="hahahahb";
int ret_val=strcmp(p1,str2);//两个字符串str1和str2内容相等
int ret_val1=strcmp(p1,str3);//第一个不相等的字符str1(a)<str3(b)
int ret_val2=strcmp(str3,p1);// 第一个不相等的字符str2(b)>str1(a)
printf("返回值是:%d %d %d \n",ret_val,ret_val1,ret_val2);
//返回值是 : 0 -1 1
system("pause");
return 0;
}