zoukankan      html  css  js  c++  java
  • 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也一样。

  • 相关阅读:
    Flink安装排坑指南
    Java对类进行XSS过滤
    java.sql.SQLException: 无法转换为内部表示
    Flutter环境搭建
    运行npm命令 TypeError: Cannot read property 'get' of undefined
    利用Xilinx的cordic ip做开方运算
    modelsim脚本化仿真出现的两个错误
    opencv中使用imread()读入的图像,始终为显示为8位深度
    PS端时钟供给PL使用的问题
    Xilinx 使用shift_RAM消耗分布式RAM(LUTRAM)还是BRAM (Block RAM)?
  • 原文地址:https://www.cnblogs.com/wy1290939507/p/4479333.html
Copyright © 2011-2022 走看看