简述Makefile的作用:
通过命令”make”就可以启动make工程管理器对程序进行编译,所以不再需要每次都输入gcc命令行。make启动后会根据makefile文件中的编译规则命令自动对源文件进行编译和链接,最终生成可执行文件,还有一点就是它的调试效率高,make会检查每个源文件的修改时间,只有在上次编译以后被改动的源文件才会在接下来的编译过程中被编译链接,避免多余的编译工作。
.sizeof与strlen的区别:
sizeof是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。
它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。具体而言,当参数分别如下时,sizeof返回的值表示的含义如下:数组——编译时分配的数组空间大小;指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4)
strlen是函数,要在运行时才能计算。参数必须是字符型指针。当数组名作为参数传入时,实际上数组就退化成指针了。
它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL。返回的长度大小不包括NULL
c语言分配内存的方式有哪些?
1、从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在,例如全局变量,static变量。
2、在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放,栈内存分配运算内置于处理器的指令集中,效率很高,凡是分配的内存容量有限。
3、从堆上分配。也称动态内存分配。程序在运行的时候用malloc或者new申请任意多少的内存,程序员自己负责在何时用free或者delete释放内存。
c语言中常见的内存错误有哪些?
1.指针没有指向一块合法的内存。
2.为地址分配的内存太小。
3.存在越界。
4.内存分配成功,但并未初始化。
5.内存泄漏。
.Static全局变量与普通变量的区别?
static 全局变量只初始化一次,防止在其他文件单元中被引用。
Static局部变量与普通局部变量的区别?
static 全局变量只初始化一次,下一次依据上一次结果。
Static函数与普通函数的区别?
static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。
把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。
#include <> 和 #include "" 有什么区别?
#include< >引用的是编译器的类库路径里面的头文件。
#include“ ”引用的是你程序目录的相对路径中的头文件。
char *const p :这里const在p之前,修饰的是p,即p是不可修改的 ,p所指向的内容可以修改
char const *p :char const *p; const位于char *之间,由于char *是p的类型,此种写法和const char *等价
const char *p :p是一个char *类型的变量,但char *前面有一个const修饰,即p所指向的内容为const类型不可修改
写一个 宏MIN,这个宏输入两个参数并返回较小的一个, 另外,当你写下面代码时会发生什么事?
least = MIN(*p++,b);
#define MIN(A,B) ((A) <= (B) ? (A) : (B))
宏定义中括弧中的“参数”也不是真的参数,在宏展开的时候对“参数”进行的是一对一的替换
找出题中错误,并解释
void test1()
{
char string[10];
char* str1 = "0123456789"
strcpy(string, str1);
}
10改成11。
找出题中错误,并解释
void GetMemory( char *p )
{
p = (char *) malloc( 100 );
}
void Test( void )
{
char *str = NULL;
GetMemory( str );
strcpy( str, "hello world" );
printf("%s", str);
}
//这是原来的函数,使用的是值传递方式
void GetMemory(char *p){ p=(char *)malloc(100); }
//这是正确的内存分配函数,使用的是双重指针,传递进来的是str的指针地址,*p就是原来的str
void GetMemory2(char **p) { *p=(char*)malloc(100); }
//这是使用引用的内存分配函数
void GetMemory3(char* &p) { p=(char*)malloc(100); }
void Test(void){
char *str=NULL;
GetMemory(str); // 该函数做的工作是 p=str, p=malloc(100); 和str一点关系都没有,str=NULL;
//GetMemory2(&str); //该函数做的工作是 char**p=&str, str=*p=malloc(100),内存分配成功
//GetMemory3(str); // 传递的是str的引用,函数内的 p还是str,分配成功
strcpy(str, "Hello World!"); //现在可以 知道,第一个函数分配内存错误,strcpy也会失败
printf("%s\n", str); //输出只能是空
}