zoukankan      html  css  js  c++  java
  • 函数内动态分配内存

    void fun() 
    { 
        char* s = (char*)malloc(100); 
    } 

    操作系统为程序分配空间分栈和堆~~ "定义"局部普通变量和局部指针变量时,只是在栈里分配了块空间,由高地址向低地址扩展,在函数调用结束后自动释放。而定义全局变量,静态变量,指针用malloc或new分配空间是在堆里分配的,除非是程序完全退出才释放,而malloc或new的要想用完就释放的调用free和delete来释放~~~ 

    char* s = (char*)malloc(100); //开辟了两个空间,S在栈中,malloc(100)在堆中
    指针s是局部指针变量(在栈中分配),所以执行完 fun函数后S已弹栈(既释放),而堆中申请的malloc(100)没有释放 ,必须由程序员释放, 若程序员不释放(会造成内存泄漏),程序结束时可能由OS回收.

    S已经被释放,但内存没有收回。内存泄露!
    说白了:就是S这个变量被删除了,不能再使用了,但它申请的那快内存切还是有效的,可以使用。但是拿什么去使用它?(S都没有了)。可以在后面加return s(当然函数的void要改掉,然后用个变量去接受传回来的内存地址!)

    可在外面用数组申请一个较大的栈空间,并初始化为0,然后传参进去:

    unsigned char * get_rand_string(int a1,int a2,char* str)
    {
        int big = a1<0 ? -a1 : a1;
        int s = a2<0 ? -a2 : a2;
        if(big <= s)
        {
            int tmp = s;
            s = big;
            big = tmp;
        }
    
        //srand((unsigned)time(NULL));
        big = (BYTE)rand() % (big - s + 1);
        if(big < 0) {
            big = -big;
        }
    
        s += big;
        char* v2 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
        unsigned char* v3 = new unsigned char[s+1];
        memset(v3,0,s+1);
    
        big = 0;
        while(big < s) {
            //srand((unsigned)time(NULL));
            v3[big]=v2[(BYTE)rand()%0x3e];
            ++big;
        }
        memcpy_s(str,s,v3,s);
        return v3;
    }
    
    
    int main(){
        char buf[1024] = {0};
        get_rand_string(16,18,buf);
        cout<<strlen(buf);
        cout<<endl;
        return 0;
    }
  • 相关阅读:
    经典论文(转载)
    sublime编辑器Ctrl+E快捷键无效解决方法(转)
    Angular CLI 安装和使用(转发)
    tf.repeat() tensorflow
    colab使用
    记stanford-corenlp的使用
    gesim_word2vec训练词向量
    jupyter中不能用tensorflow
    Distributed Representations of Words and Phrases and their Compositionality论文阅读及实战
    A Neural Probabilistic Language Model_论文阅读及代码复现pytorch版
  • 原文地址:https://www.cnblogs.com/xunbu7/p/4931153.html
Copyright © 2011-2022 走看看