如果printf 函数喝醉了
char a[12];
printf("%d\n",sizeof(a)); //12
printf("%d\n",strleng(a));//喝醉了,无初始化
静态数据区
常量数据区
代码区
栈区
堆区
变量生存周期 静态,自动,动态。
静态生存 全局变量直到程序结束收回。
自动生成 局部变量和函数 执行完毕就结束 内存被回收。
动态生成 程序员控制的,malloc和free回收。
批量处理 或者 大小不确定 动态分配就好
动态内存空间分配步骤:
1,定义个指针变量;
2,然后申请内存空间,首地址给指针,用完释放。
示列:
void * p =nullptr;
p=malloc(10); //放堆里
//.....
free(p);
malloc 不出来了
1,内存满了,2 堆坏了,破坏堆前后标志。
刚分配的动态内存初始值是不确定了的
对一个指针引用free之后,他的值不会改变,它指向一块无效内存区,这时候该指针为悬空指针。
不能指向金泰内存区域(全局变量)或栈内存区(局部变量的指针引用free)
如果不释放内存空间,内存会泄露,时间长了,内存空间就消耗掉了。
容易出错的常见地方:
内存分配没成功,使用它,有问题;
内存分配成功了,但没初始华,有问题;
内存分配成功,初始化,操作乱用,内存超过边界。有问题;
忘记释放内存,造成内存泄漏,有问题。
释放了内存,还继续用它,还是有问题。
内存初始化函数memset:
void*memset(
void *dest,//目标缓存
int c,//初始化信息
size_t count);初始化大小
内存拷贝函数memcpy
悬空指针
int*p=(int*)malloc()
free(p);
//do something
*p = 7;
所以要浮空 p= NULL;
void fun(char a[],int nLen)
for(int i =0;i<nlen;i++)
a[i]+i+2;
#define size_elements(a) (sizeof(a)/sizeof(a[0])) 这个不能,但有个宏,可以解决;_countof()