首页 > 编程 > C > 正文

关于define与C 的内存

2020-01-26 14:31:21
字体:
来源:转载
供稿:网友

问题1:#define到底存在程序的哪个区?

自己写了一个小程序验证一下第一个问题。

程序代码:

<span style="font-size:18px;">#include <stdio.h>#include <STDLIB.H>#define kMAX 100typedef 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>

 发现:

1、通过运行代码可以看出程序的几个内存区互不相邻;

2、#define的内存单元在程序运行前已经分配。

3、我们知道,char *会存在常量区,但如果我们把char *“封装”到一个struct里,这时它会同该struct分配到栈区中,也就是说,我们可以修改struct中char *里的值。

----------------------------------------------------------------------------------------------------------------------------------------------------------

问题2:我们已经知道,宏实质上是替换,而函数是传参,调用。那么,带参数宏与普通函数在效率上有什么区别?

通过查阅一些资料了解到

1、普通函数是在程序运行时调用,程序会给它的成员分配内存。而带参宏是在编译前就已经执行,并且不会分配内存单元。

2、宏替换不占用运行时间,只占用编译时间。函数则占用运行时间。所以,如果想提高程序运行效率,可以用宏代替部分函数。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选