C语言中如何实现动态数组:
方法一:
int n;
......
int array[n];
方法二:
int n;
......
int *p;
p=(int*)malloc(n*sizeof(int));
int *p1;
p1=(int*)calloc(n,sizeof(int));
二维数组:
int (*p2)[6];//在c99之前可以使用
p2=(int (*)
[6])malloc(n*6*sizeof(int));//n*6的数组
int col,row;
.....
int (*p3)[col] = (int
(*)[])malloc(row*col*sizeof(int));//要求变长数组支持,在c90是不可以用的,c99可以使用
malloc与calloc区别:
malloc,calloc和free都在中
C语言分配内存有三种方式:
1.静态分配:在程序运行之前就已经分配好(编译阶段),例如全局变量,static变量。当整个程序结束时销毁。
2.栈的分配:在程序运行中,分配栈内存给函数的局部变量,当这段函数运行结束时自动释放。例如auto变量。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
3.动态分配:在程序运行时,有程序员代码决定内存的分配和释放。用free释放,注意内存泄漏。当程序结束时,也会全部释放内存。优点:灵活。缺点:动态分配过程中,可能使内存碎片化,从而导致进程比使用栈内存而慢。
void
malloc(要分配内存的大小以字节计算),在ANSI之前版本,返回一个char。在ANSIC中返回void指针,如果没有找到内存可以分配返回NULL指针。
void calloc(内存单元的数量,每个单元的大小以字节计算);
calloc,
在ANSI之前版本,返回一个char指针,在ANSI返回一个void指针
分配成功的指针指在所分配内存的起始处。
他们的主要区别是:
calloc会对分配的内存进行初始化,块中的全部位置设置为零。(在某些系统中,浮点数0的初始值,并不是全部用0来表示的)。
realloc有个细节需要注意:
无非就是将已经存在的一块内存扩大。
char* p = malloc(1024);
char* q = realloc(p,2048);
现在的问题是我们应该如何处理指针 p。 刚开始按照我最直观的理解,如果就是直接将 p = NULL;。 到最后只需要释放
q的空间就可以了。
因为最近在做个封装。结果在做单元测试的时候发现。有时候我在 free(q); 的时候会出错。这样我就郁闷了。
后来仔细一跟踪,发现 realloc 完以后 q 和 p 的指针地址是一样。不过有时候又不一样。
仔细查了下资料。得到如下信息:
1.如果 当前连续内存块足够 realloc 的话,只是将p所指向的空间扩大,并返回p的指针地址。 这个时候 q 和 p
指向的地址是一样的。
2.如果
当前连续内存块不够长度,再找一个足够长的地方,分配一块新的内存,q,并将 p指向的内容 copy到 q,返回
q。并将p所指向的内存空间删除。
这样也就是说 realloc 有时候会产生一个新的内存地址 有的时候不会。所以在分配完成后。我们需要判断下 p 是否等于
q。并做相应的处理。
这里有点要注意的是要避免 p = realloc(p,2048); 这种写法。有可能会造成 realloc
分配失败后,p原先所指向的内存地址丢失。