关于define与C 的内存

2025-05-27 0 78

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

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

程序代码:

?

1

2

3

4

5

6

7

8

9

10

11

12
<span style="font-size:18px;">#include <stdio.h>

#include <STDLIB.H>

#define kMAX 100

typedef struct {

int ID;

char * name;

}Student;

void test()

{

return;

}

//常量区,静态区,堆区,栈区,程序代码区

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33
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、宏替换不占用运行时间,只占用编译时间。函数则占用运行时间。所以,如果想提高程序运行效率,可以用宏代替部分函数。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 关于define与C 的内存 https://www.kuaiidc.com/74517.html

相关文章

发表评论
暂无评论