动态内存分配 (malloc)
函数原型:
void *malloc (size_t size)
size_t是无符号的长整形
动态内存在堆段
返回值void*表示泛型指针,可以赋给任意一个类型的指针变量
函数类型存储在栈段
eg:
char *p = malloc(1000);
p 是这一千个字节的首地址
p+1是第2个字节的地址
定义后可以使用他的每一个空间
int *q = malloc(1000);
q[0]是前4个字节,使用q可以4字节4字节的访问空间
堆空间的分配有可能失败
char *p = malloc(1000);
if (!p)
{
perror("malloc");
exit(-1);
}//exit 表示将当前进程终止 return表示将当前函数终止 不管在main函数还是其他函数,用到exit程序会终止
使用完毕,要释放
free(p);
内容并没有改变,只是权限释放掉
开辟堆空间,告诉系统这块空间已被占用
栈空间是静态内存分配,编译时就已经决定了,main开辟空间根据声明的变量决定,不会在改变
堆空间是动态内存分配,是在运行的时候决定的
数组的大小占用的空间在编译代码的时候就已经决定了,属于静态内存分配
动态内存分配
大小运行时决定
程序员分配
堆段
手动释放
静态
大小编译时决定
编译器分配
栈段 数据段 只读数据段
自动释放
函数原型:
void *malloc (size_t size)
size_t是无符号的长整形
动态内存在堆段
返回值void*表示泛型指针,可以赋给任意一个类型的指针变量
函数类型存储在栈段
eg:
char *p = malloc(1000);
p 是这一千个字节的首地址
p+1是第2个字节的地址
定义后可以使用他的每一个空间
int *q = malloc(1000);
q[0]是前4个字节,使用q可以4字节4字节的访问空间
堆空间的分配有可能失败
char *p = malloc(1000);
if (!p)
{
perror("malloc");
exit(-1);
}//exit 表示将当前进程终止 return表示将当前函数终止 不管在main函数还是其他函数,用到exit程序会终止
使用完毕,要释放
free(p);
内容并没有改变,只是权限释放掉
开辟堆空间,告诉系统这块空间已被占用
栈空间是静态内存分配,编译时就已经决定了,main开辟空间根据声明的变量决定,不会在改变
堆空间是动态内存分配,是在运行的时候决定的
数组的大小占用的空间在编译代码的时候就已经决定了,属于静态内存分配
动态内存分配
大小运行时决定
程序员分配
堆段
手动释放
静态
大小编译时决定
编译器分配
栈段 数据段 只读数据段
自动释放