---------- IOS培训、java培训、期待与您交流! ----------
首先介绍c语言中最常使用的内存分配方式
//void *malloc(size_t size);
//泛型指针 可以赋给任何类型的指针变量
int main(int argc, const char * argv[]) {
char *p = malloc(1000);
p[0]; //开辟第一个堆 空间的第一个字节
p[1];//*(p+1)
if (p==NULL) {
perror("malloc error");
exit(-1);
}
p[0]='A';//堆空间的首地址存上了‘A’
free(p); //堆空间释放
return 0;
}而如果我们在方法里这样写
int * func(){
int a; //a 是在栈里面的
a=10;
return &a;
}
这样是不可以的。因为a是一个局部变量,func方法运行完后,就收回了a所在的栈空间;但是我们这样写
int * func(){
int a; //a 是在栈里面的
int *p1=malloc(4);
if (!p1) {
perror("malloc p1 error");
exit(-1);
}
return p1;
}
// 这是可以的,因为 p 在堆里面。 堆空间不会随着 func 的消失而消失
特别注意的是:
// 栈空间 静态内存分配 编译时决定的
// 堆空间 动态内存分配 运行时决定的
// 静态内存分配 大小编译时决定 编译器分配的 自动释放 栈 数据 只读
// 动态内存分配 大小运行时决定 程序员分配的 手动释放的 堆段
-------------------------以下是静态内存分配----------------------------------
char buf[10001]; //不能灵活调整
int i=0;
while (i++<100) {
scanf("%s",buf);
printf("%s\n",buf);
可以看到,当我们要往char字符中存取一些数据,这样普通的做法,就显得太浪费。比如我们第一次输入1000个,之后99次每次都输入几个字符。这样子的做法就显示不够灵活。
--------------以下为动态内存分配---------------------
int main(int argc, const char * argv[]) {
int n;
int i=0;
while (i++<100) {
scanf("%d",&n);
char *buf = malloc(n+1);
if (!buf) {
perror("malloc error");
exit(-1);
}
scanf("%s",buf);
printf("%s\n",buf);
free(buf);
}
return 0;
}