c/c++笔试准备
1.判断下列程序能不能正确输出
#include<stdio.h> #include<string.h> void New(char* p) { p=new char[5]; } void main() { char *p=NULL; New(p); strcpy(p,"hello"); //需要头文件stdio.h和string.h printf("%s",p); }
答案:不能。要改成:
void New(char* &p) { p=new char[5]; }
2.数字反转问题
class Solution { public: int reverse(int x) { short flag = x>0? 1:-1; int X = abs(x); int res = 0; while(X){ if((flag && (INT_MAX-X%10)/10 < res) || (!flag && INT_MIN+res*10+X%10 > 0)){ //数字溢出的处理 return 0; } res = res*10 + X%10; X /= 10; } return flag * res; } };
补充知识:
new与delete
(1). new() 分配这种类型的一个大小的内存空间,并以括号中的值来初始化这个变量;
eg: int *a = new int(5) //初始化一个大小的int型指针,所指向的值为5
eg: string *str = new string(“test new”);
(2). new[] 分配这种类型的n个大小的内存空间,并用默认构造函数来初始化这些变量;
eg: int **a = new int[5][6]
(3)当使用new运算符定义一个多维数组变量或数组对象时,它产生一个指向数组第一个元素的指针,返回的类型保持了除最左边维数外的所有维数;
eg: int (*p2)[10] = new int[2][10]; 去掉最左边的那一维,p2指向的是一个int[10]一维数组的指针int (*)[10].
(4). cout<<*p<<endl; //只是输出p指向的字符串的第一个字符!
cout<<p<<endl; //输出p指向的字符串!
(5).delete [] p; //删除p的数组
delete p; //删除单一的p
一旦删除了指针所指的对象,立即将指针置为0
malloc和free
(1)申请了内存空间后,必须检查是否分配成功。
(2)当不需要再使用申请的内存时,记得释放;释放后应该把指向这块内存的指针指向NULL,防止程序后面不小心使用了它。
(3)这两个函数应该是配对。如果申请后不释放就是内存泄露;如果无故释放那就是什么也没有做。释放只能一次,如果释放两次及两次以上会出现错误(释放空指针例外,释放空指针其实也等于啥也没做,所以释放空指针释放多少次都没有问题)。
malloc和new的区别
(1)new 返回指定类型的指针,并且可以自动计算所需要大小。 而 malloc 则必须要由我们计算字节数,并且在返回后强行转换为实际类型的指针。
(2) malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。
除了分配及最后释放的方法不一样以外,通过malloc或new得到指针,在其它操作上保持一致。
有了malloc/free为什么还要new/delete?
(1) malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
(2) 对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
我们不要企图用malloc/free来完成动态对象的内存管理,应该用new/delete。由于内部数据类型的“对象”没有构造与析构的过程,对它们而言malloc/free和new/delete是等价的。
(3) 既然new/delete的功能完全覆盖了malloc/free,为什么C++不把malloc/free淘汰出局呢?这是因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。
如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc申请的动态内存”,结果也会导致程序出错,但是该程序的可读性很差。所以new/delete必须配对使用,malloc/free也一样。