C语言中关于内存划分的问题
C语言中将内存空间划分为:全局区:存储静态变量和全局变量;堆区:存储由程序员通过Malloc等函数分配的空间;栈区:存储局部变量,函数调用时的状态信息;字符常量区:存放字...
C语言中将内存空间划分为:
全局区:存储静态变量和全局变量;
堆区:存储由程序员通过Malloc等函数分配的空间;
栈区:存储局部变量,函数调用时的状态信息;
字符常量区:存放字符常量;
程序代码区:存放二进制的程序代码。
另外,书上介绍C语言将内存划分为:静态存储区、动态存储区。
静态存储区就是前面的全局区,而动态存储区包含了堆栈区。
我的问题是,前一种分类中的字符常量区是否属于动态存储区,以及程序代码区是否属于后一种分类中的静态存储区或动态存储区?
最好高手能够对内存的划分情况(当然是指和c语言相关的)具体说明一下。 展开
全局区:存储静态变量和全局变量;
堆区:存储由程序员通过Malloc等函数分配的空间;
栈区:存储局部变量,函数调用时的状态信息;
字符常量区:存放字符常量;
程序代码区:存放二进制的程序代码。
另外,书上介绍C语言将内存划分为:静态存储区、动态存储区。
静态存储区就是前面的全局区,而动态存储区包含了堆栈区。
我的问题是,前一种分类中的字符常量区是否属于动态存储区,以及程序代码区是否属于后一种分类中的静态存储区或动态存储区?
最好高手能够对内存的划分情况(当然是指和c语言相关的)具体说明一下。 展开
4个回答
展开全部
数据结构专门有讲的,下几个课件看看就行了.
1.分配内存空间函数malloc
调用形式: (类型说明符*) malloc (size) 功能:在内存的动态存储区中分配一块长度为"size" 字节的连续区域。函数的返回值为该区域的首地址。 “类型说明符”表示把该区域用于何种数据类型。(类型说明符*)表示把返回值强制转换为该类型指针。“size”是一个无符号数。例如: pc=(char *) malloc (100); 表示分配100个字节的内存空间,并强制转换为字符数组类型, 函数的返回值为指向该字符数组的指针, 把该指针赋予指针变量pc。
2.分配内存空间函数 calloc
calloc 也用于分配内存空间。调用形式: (类型说明符*)calloc(n,size) 功能:在内存动态存储区中分配n块长度为“size”字节的连续区域。函数的返回值为该区域的首地址。(类型说明符*)用于强制类型转换。calloc函数与malloc 函数的区别仅在于一次可以分配n块区域。例如: ps=(struet stu*) calloc(2,sizeof (struct stu)); 其中的sizeof(struct stu)是求stu的结构长度。因此该语句的意思是:按stu的长度分配2块连续区域,强制转换为stu类型,并把其首地址赋予指针变量ps。
3.释放内存空间函数free
调用形式: free(void*ptr); 功能:释放ptr所指向的一块内存空间,ptr 是一个任意类型的指针变量,它指向被释放区域的首地址。被释放区应是由malloc或calloc函数所分配的区域:
如
main()
{
struct stu
{
int num;
char *name;
char sex;
float score;
} *ps;
ps=(struct stu*)malloc(sizeof(struct stu));
ps->num=102;
ps->name="Zhang ping";
ps->sex='M';
ps->score=62.5;
printf("Number=%d\nName=%s\n",ps->num,ps->name);
printf("Sex=%c\nScore=%f\n",ps->sex,ps->score);
free(ps);
}
1.分配内存空间函数malloc
调用形式: (类型说明符*) malloc (size) 功能:在内存的动态存储区中分配一块长度为"size" 字节的连续区域。函数的返回值为该区域的首地址。 “类型说明符”表示把该区域用于何种数据类型。(类型说明符*)表示把返回值强制转换为该类型指针。“size”是一个无符号数。例如: pc=(char *) malloc (100); 表示分配100个字节的内存空间,并强制转换为字符数组类型, 函数的返回值为指向该字符数组的指针, 把该指针赋予指针变量pc。
2.分配内存空间函数 calloc
calloc 也用于分配内存空间。调用形式: (类型说明符*)calloc(n,size) 功能:在内存动态存储区中分配n块长度为“size”字节的连续区域。函数的返回值为该区域的首地址。(类型说明符*)用于强制类型转换。calloc函数与malloc 函数的区别仅在于一次可以分配n块区域。例如: ps=(struet stu*) calloc(2,sizeof (struct stu)); 其中的sizeof(struct stu)是求stu的结构长度。因此该语句的意思是:按stu的长度分配2块连续区域,强制转换为stu类型,并把其首地址赋予指针变量ps。
3.释放内存空间函数free
调用形式: free(void*ptr); 功能:释放ptr所指向的一块内存空间,ptr 是一个任意类型的指针变量,它指向被释放区域的首地址。被释放区应是由malloc或calloc函数所分配的区域:
如
main()
{
struct stu
{
int num;
char *name;
char sex;
float score;
} *ps;
ps=(struct stu*)malloc(sizeof(struct stu));
ps->num=102;
ps->name="Zhang ping";
ps->sex='M';
ps->score=62.5;
printf("Number=%d\nName=%s\n",ps->num,ps->name);
printf("Sex=%c\nScore=%f\n",ps->sex,ps->score);
free(ps);
}
展开全部
程序代码应该属于静态存储区
因为代码在运行中式不会改变的
静态就是不变的,动态就是可改变的
字符常量属于静态存储区
因为字符串常量很少需要修改,放在静态内存区会提高效率
因为代码在运行中式不会改变的
静态就是不变的,动态就是可改变的
字符常量属于静态存储区
因为字符串常量很少需要修改,放在静态内存区会提高效率
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
字符常量区在在全局区活程序代码区(取决于编译器或用法)
程序代码区时静态的,是在程序运行前就分配好的内存空间
在 main 外面定义的变量时静态的,
在函数内的是在栈里。
用 malloc 或 calloc 申请的在堆里,是动态的。
@aries00219: 静态的不一定是只读不可改变的,是指分配固定好的。
程序代码区时静态的,是在程序运行前就分配好的内存空间
在 main 外面定义的变量时静态的,
在函数内的是在栈里。
用 malloc 或 calloc 申请的在堆里,是动态的。
@aries00219: 静态的不一定是只读不可改变的,是指分配固定好的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
程序代码不是专门放在一个内存区域中么?貌似不属于上面的任何一种。上面所说的区域划分是指程序运行过程中占用的内存区域,不包括程序本身。
仅个人理解,如有错误,也没办法。谁叫我也不是很懂。。。
仅个人理解,如有错误,也没办法。谁叫我也不是很懂。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询