一.内存的常见分配方式
1. 从静态区分配,一般是全局变量和static类型变量
2.从栈区分配内存,一般是局部的变量,会随着所在函数的结束而自动释放
3.从堆中分配,一般是使用手动分配,使用malloc()函数和new来申请任意大小空间,不过要手动释放空间,相应的使用free()函数和delete释放,
如果不释放该空间,而且指向该空间的指针指向了别的空间.则该空间就无法释放,造成内存泄露,造成了内存浪费
二.内存的使用规则
1.在使用malloc()或new申请空间时,要检查有没有分配空间成功,判断方法是判断指针是否为NULL,如申请一块很大的内存而没有这么大的内存则分配内存会失败
3.不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。(这句话不太理解)
4.要防止数组或指针内存越界,
5.申请内存成功后,使用结束后要释放,系统不会自动释放手动分配的内存
6.内存释放后,指针还是指向那块地址,不过这指针已经是"野指针"了,所以释放内存后指针要指向NULL,不然很危险,容易出错,if()对野指针的判断不起作用
三.指针和数组
1. 数组里的数据可以单个修改,但指针的不行,如我的例子,char str[] = "hello",数组的大小有6个字符(注意\0),可以通过str[0] = 'X'修改了的个字符,而指针
char *p = "Word",p是指向了一串常量的字符串,常量字符串是不可修改的,如 p[0] = 'X',编译器编译时不会保存,但执行时会出错。
- // 数组…
- char a[] = "hello";
- char b[10];
- strcpy(b, a); // 不能用 b = a;
- if(strcmp(b, a) == 0) // 不能用 if (b == a)
- // 指针…
- int len = strlen(a);
- char *p = (char *)malloc(sizeof(char)*(len+1));
- strcpy(p,a); // 不要用 p = a;
- if(strcmp(p, a) == 0) // 不要用 if (p == a)
3,计算空间的大小
对数组的计算是使用sizeof()函数,该函数会按照内存对齐的方式4的倍数计算,而指针的空间大小没法计算,只能记住在申请空间时的空间大小
注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针,不论数组a的容量是多少,sizeof(a)始终等于sizeof(char *)
(困扰好久)
- void Func(char a[100])
- {
- cout<< sizeof(a) << endl; // 4字节而不是100字节
- }