函数内动态分配内存
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; }