源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

关于define与C 的内存

  • 时间:2020-01-27 00:34 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:关于define与C 的内存
[b]问题1:#define到底存在程序的哪个区?[/b] 自己写了一个小程序验证一下第一个问题。 程序代码:
<span style="font-size:18px;">#include <stdio.h>
#include <STDLIB.H>
#define kMAX 100
typedef struct {
 int ID;
 char * name;
}Student;

void test()
{
 return;
}
//常量区,静态区,堆区,栈区,程序代码区
const int a = 100;
char * b = "ok123";

int main()
{
 Student stu = {10,"张三"};
 int n = 9999;
 int *p = &n;
 int num[10] = {1,2,3,4};
 int *ap=(int*)malloc(100*sizeof(int));//动态分配内存
 static int k = 9;

 printf("常量区\n");
 printf("const int(%p)\n",&a);
 printf("char *(%p)\n",b);
 printf("静态区\n");
 printf("static int (%p)\n",&k);
 printf("堆区\n");
 printf("(int*)malloc(100*sizeof(int))(%p)\n",ap);
 printf("栈区\n");
 printf("struct int(%p),struct char *(%p)\n",&stu.ID,&stu.name);
 printf("int [](%p)\n",num);
 printf("int *(%p)\n",&p);
 printf("int(%p)\n",&n);
 printf("程序代码区\n");
 printf("test()(%p)\n",test);
 printf("未知\n");
 printf("define (%p)\n",kMAX);
 
 free(ap);

 return 0;
}</span>
[b] 发现:[/b] 1、通过运行代码可以看出程序的几个内存区互不相邻; 2、#define的内存单元在程序运行前已经分配。 3、我们知道,char *会存在常量区,但如果我们把char *“封装”到一个struct里,这时它会同该struct分配到栈区中,也就是说,我们可以修改struct中char *里的值。 ---------------------------------------------------------------------------------------------------------------------------------------------------------- [b]问题2:我们已经知道,宏实质上是替换,而函数是传参,调用。那么,带参数宏与普通函数在效率上有什么区别?[/b] 通过查阅一些资料了解到 1、普通函数是在程序运行时调用,程序会给它的成员分配内存。而带参宏是在编译前就已经执行,并且不会分配内存单元。 2、宏替换不占用运行时间,只占用编译时间。函数则占用运行时间。所以,如果想提高程序运行效率,可以用宏代替部分函数。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部