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也一样。

原文地址:https://www.cnblogs.com/wy1290939507/p/4479333.html