断言
void assert( int expression );
assert宏的原型定义在<assert.h>中,其作用是先计算表达式 expression ,如果expression的值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用abort 来终止程序运行。
#include <stdio.h>
#include <assert.h>
int main( void )
{
int i;
i=1;
assert(i++);
printf("%d\n",i);
return 0;
}
看看运行结果,因为我们给定的i初始值为1,所以使用assert(i++);语句的时候不会出现错误,进而执行了i++,所以其后的打印语句输出值为2。如果我们把i的初始值改为0,那么就回出现如下错误。
Assertion failed: i++, file E:\fdsa\assert2.cpp, line 8
Press any key to continue
静态数组
静态数组的长度是预先定义好的,在整个程序中,一旦给定大小后就无法改变。
动态数组则不然,它可以随程序需要而重新指定大小。动态数组的内存空间是从堆动态分配的。是通过执行代码而为其分配存储空间。当程序执行到我们编写的分配语句时,才为其分配。对于静态数组,其创建非常方便,使用完也无需释放,要引用也简单,但是创建后无法改变其大小是其致命弱点!对于动态数组,其创建麻烦,使用完必须由程序员自己释放,否则将会引起内存泄露。但其使用非常灵活,能根据程序需要动态分配大小。所以相对于静态数组的来说我们对于使用动态数组有很大的自由度。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n1,i;
int *array;
printf("请输入所要创建的一维动态数组的长度:");
scanf("%d",&n1);
array=(int*)calloc(n1,sizeof(int));
for(i=0;i<n1;i++)
{
printf("%d\t",array[i]);
}
printf("\n");
for(i=0;i<n1;i++)
{
array[i]=i+1;
printf("%d\t",array[i]);
}
free(array);//释放第一维指针
return 0;
}
而calloc则进行了初始化,calloc分配的空间全部初始化为0,这样就避免了可能的一些数据错误
malloc一个形参,因此如果是数组,必须由我们计算需要的字节总数作为形参传递
用malloc只分配空间不初始化,也就是依然保留着这段内存里的数据,
int * ip_a;
ip_a = (int*)malloc( sizeof (int) * 5 );
ip_a = ( int* )calloc( 5, sizeof(int) );
realloc
const int size = 2000;
int *p = (int *)malloc(20 * sizeof(int));
int *p1 = (int *)realloc(p, size*sizeof(int));
printf("%x\n", p);
printf("%x\n", p1);
system("pause");
return 0;
realloc会重新开辟一个新的内存空间,并把原来的内存空间的内容拷贝到新的内存空间里。