静态分配就是在编译程序的时候就确定空间,动态分配就是在运行过程中由程序本身根据需要来确定空间。
malloc语法
void *malloc( size_t size ); |
说明:malloc向系统申请分配指定size个字节的内存空间,返回类型是 void* 类型,void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。
malloc往往和free配对使用,free用于释放相应的内存。
void free( void *ptr); |
1 2 | char *p; p=(char *)malloc(sizeof(char)*20); |
上面的代码表示malloc分配了20个字符空间,将未确定类型的指针强制转换成char *后再赋值给p。
(2011年3月填空题14题)以下程序运行后的输出结果是_____。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { char *p; int i; p=(char *)malloc(sizeof(char)*20); strcpy(p,"welcome"); for(i=6; i>=0; i--) putchar(*(p+i)); printf("\n"); free(p); return 0; } |
运行结果:emoclew
这个例子分配的是固定的20个字符空间,也可以采用下面的方式来实现差不多的功能。
1 2 3 4 5 6 7 8 9 10 11 | #include <stdio.h> #include <string.h> int main(int argc, char *argv[]) { char s[20], *p=s; int i; strcpy(p,"welcome"); for(i=6; i>=0; i--) putchar(*(p+i)); printf("\n"); return 0; } |
这两个程序的区别:前者的空间用malloc分配后,使用完毕,就用free释放了;后者在整个程序运行过程中始终占用,直到程序使用完毕。
(2007年4月)以下程序的输出结果是_________。
1 2 3 4 5 6 7 8 9 10 11 12 | #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { char *s1,*s2,m; s1=s2=(char*)malloc(sizeof(char)); *s1=15; *s2=20; m=*s1+*s2; printf("%d\n",m); return 0; } |
【解析】malloc开辟了空间后,将地址复制给了s1和s2,都指向了同一个存储单元s。 下面的代码表达了同样的意思。
1 2 3 4 5 6 7 8 9 10 11 | #include <stdio.h> int main(int argc, char *argv[]) { char s, *s1,*s2,m; s1=s2=&s; s=15; s=20; m=*s1+*s2; printf("%d\n",m); return 0; } |