函数内动态分配内存

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;
}
原文地址:https://www.cnblogs.com/xunbu7/p/4931153.html