1.简述Makefile的作用
makefile文件和make工具一起使用,用于控制工程项目的编译和链接,也可以用来编写手册页和程序的安装。make工具用于解释执行makefile文件中的内容。makefile文件中通常包含源文件和目标文件的依赖关系以及从源文件生成目标文件的规则。make工具可以根据makefile判断哪些文件需要被重新编译,目标文件的构建顺序等。
Makefile:
1.需要生成的目标文件
2.生成目标文件所需要的依赖文件
3.生成目标文件的编译规则命令行
2.sizeof与strlen的区别:
strlen 是函数, 测量的是字符的实际长度,以'\0' 结束。sizeof 是运算符,测量的是一个变量或者类型的大小。
3.什么是野指针?如何避免野指针。
定义:野指针是指向未知地址的指针
产生原因:1.定义一个指针变量时没有初始化
2.动态分配内存空间后用free()释放内存空间,但没有将指针置为空指针
3.对指针的操作超出了指针变量的作用域
危害:1.指向不可访问的地——>段错误
2.指向一个可用的,但无明确意义的空间——>程序正常运行,但有隐患
3.指向一个可用的,而且正在被使用的空间——>突然被改变,程序运行会有影响,程序会崩溃,数据被破坏
如何避免:对指针进行初始化
1.将指针置为NULL
2.用malloc分配内存(注意:检查是否分配成功)
3.用已有合法的可访问的内存地址对指针初始化
4.c语言分配内存的方式有哪些?
c语言中常见的内存错误有哪些?
1.从静态存储区域分配:全局变量,用static 定义的变量。(存在于整个程序的运行期间)
2.从栈上创建:函数内的局部变量函数。(随函数结束自动释放)
3.从堆上创建:用malloc或者new申请的内存空间。(用free或者delete释放)
5.Static全局变量与普通变量的区别?
Static局部变量与普通局部变量的区别?
Static函数与普通函数的区别?
1.Static全局变量与普通变量的区别:static全局变量和普通全局变量的存储方式相同但是作用域不同。普通全局变量的作用域是整个源程序,当一个源程序由多个原文件组成时,普通全局变量在各个源文件中都是有效的。而static全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。
2.Static局部变量与普通局部变量的区别:static局部变量和普通局部变量的存储方式与作用域都不同。普通局部变量只在声明它的函数被调用时才会分配栈空间,并且只能在该函数内使用。而static局部变量存储在数据段或bss段中(静态存储区),并且源文件的所有函数都可以使用它。
3.Static函数与普通函数的区别:static函数与普通函数的作用域不同。普通函数的定义和声明默认情况下是extern的,在源程序的所有文件中可见,但static函数只是在声明他的文件中可见,不能被其他文件所用。
6.#include <> 和 #include "" 有什么区别?
1.#include< > 引用的是编译器的类库路径里面的头文件。
2. #include" " 引用的是该程序目录的相对路径中的头文件。
7.char *const p; char const *p; const char *p 三者的区别。
1.char *const p:指针p的指向不可以改变,但是指针指向的值可以改变(只读变量p)
2.char const *p:指针p的指向可以改变,但是指针指向的值不可以改变(只读位置)
3.const char *p:指针p的指向不可以改变,且指针指向的值也不可以改变。
8.写一个 宏MIN,这个宏输入两个参数并返回较小的一个。
另外,当你写下面代码时会发生什么事? least = MIN(*p++,b);
#define MIN ((a)<(b)?(a):(b))
least = MIN(*p++,b); ————>返回的反而是最大值
9.找出题中错误,并解释
void test1()
{
char string[10];
char* str1 = "0123456789"
strcpy(string, str1);
}
段错误:string[10]中只有10个元素,但是str1有10个字符+一个结束符\0,一共11个字符
10.找出题中错误,并解释
void GetMemory( char *p )
{
p = (char *) malloc( 100 );
}
void Test( void )
{
char *str = NULL;
GetMemory( str );
strcpy( str, "hello world" );
printf("%s", str);
}
GetMemory()函数中是值传递方式,改成:
void GetMemory2(char **p)
{ *p=(char*)malloc(100); }
//传进来的是str的指针地址,*p就是原来的str