中文html5网站欣赏,北京兄弟搬家公司,wordpress做多语言版,网络管理app【规则1】用malloc或new申请内存之后#xff0c;应该立即检查指针值是否为NULL。防止使用指针值为NULL的内存。 【规则2】不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。 【规则3】避免数组或指针的下标越界#xff0c;特别要当心发生“多1”或者“… 【规则1】用malloc或new申请内存之后应该立即检查指针值是否为NULL。防止使用指针值为NULL的内存。 【规则2】不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。 【规则3】避免数组或指针的下标越界特别要当心发生“多1”或者“少1”操作。 【规则4】动态内存的申请与释放必须配对防止内存泄漏。 【规则5】用free或delete释放了内存之后立即将指针设置为NULL防止产生“野指针”。 数组与指针区别 数组要么在静态存储区被创建如全局数组要么在栈上被创建。数组名对应着而不是指向一块内存其地址与容量在生命期内保持不变只有数组的内容可以改变。 指针可以随时指向任意类型的内存块它的特征是“可变”所以我们常用指针来操作动态内存。指针远比数组灵活但也更危险。 内容复制与比较 不能对数组名进行直接复制与比较。示例7-3-2中若想把数组a的内容复制给数组b不能用语句 b a 否则将产生编译错误。应该用标准库函数strcpy进行复制。同理比较b和a的内容是否相同不能用if(ba) 来判断应该用标准库函数strcmp进行比较。 语句p a 并不能把a的内容复制指针p而是把a的地址赋给了p。要想复制a的内容可以先用库函数malloc为p申请一块容量为strlen(a)1个字符的内存再用strcpy进行字符串复制。同理语句if(pa) 比较的不是内容而是地址应该用库函数strcmp来比较。 C代码 // 数组… 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)*(len1)); strcpy(p,a); // 不要用 p a; if(strcmp(p, a) 0) // 不要用 if (p a) … // 数组…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)*(len1));strcpy(p,a); // 不要用 p a;if(strcmp(p, a) 0) // 不要用 if (p a)… malloc/free 的使用要点 函数malloc的原型如下 void * malloc(size_t size); 用malloc申请一块长度为length的整数类型的内存程序如下 int *p (int *) malloc(sizeof(int) * length); 我们应当把注意力集中在两个要素上“类型转换”和“sizeof”。 * malloc返回值的类型是void *所以在调用malloc时要显式地进行类型转换将void * 转换成所需要的指针类型。 * malloc函数本身并不识别要申请的内存是什么类型它只关心内存的总字节数。我们通常记不住int, float等数据类型的变量的确切字节数。例如int变量在16位系统下是2个字节在32位下是4个字节而float变量在16位系统下是4个字节在32位下也是4个字节。 在malloc的“()”中使用sizeof运算符是良好的风格但要当心有时我们会昏了头写出 p malloc(sizeof(p))这样的程序来。 * 函数free的原型如下 void free( void * memblock ); 为什么free函数不象malloc函数那样复杂呢这是因为指针p的类型以及它所指的内存的容量事先都是知道的语句free(p)能正确地释放内存。如果p是NULL指针那么free对p无论操作多少次都不会出问题。如果p不是NULL指针那么free对p连续操作两次就会导致程序运行错误。 new/delete 的使用要点 运算符new使用起来要比函数malloc简单得多例如 int *p1 (int *)malloc(sizeof(int) * length); int *p2 new int[length]; 这是因为new内置了sizeof、类型转换和类型安全检查功能。对于非内部数据类型的对象而言new在创建动态对象的同时完成了初始化工作。如果对象有多个构造函数那么new的语句也可以有多种形式。 -------------------------------- typedef的用法 在C/C语言中typedef常用来定义一个标识符及关键字的别名它是语言编译过程的一部分但它并不实际分配内存空间实例像 typedef int INT; typedef int ARRAY[10]; typedef (int*) pINT; 、#define的用法 #define为一宏定义语句通常用它来定义常量(包括无参量与带参量)以及用来实现那些“表面似和善、背后一长串”的宏它本身并不在编 译过程中进行而是在这之前(预处理过程)就已经完成了但也因此难以发现潜在的错误及其它代码维护问题它的实例像 #define INT int #define TRUE 1 #define Add(a,b) ((a)(b)); #define Loop_10 for (int i0; i10; i) #define INT int这样的语句用typedef一样可以完成用哪个好呢我主张用typedef.