關於define與C 的內存。本站提示廣大學習愛好者:(關於define與C 的內存)文章只能為提供參考,不一定能成為您想要的結果。以下是關於define與C 的內存正文
成績1:#define究竟存在法式的哪一個區?
本身寫了一個小法式驗證一下第一個成績。
法式代碼:
<span >#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>
發明:
1、經由過程運轉代碼可以看出法式的幾個內存區互不相鄰;
2、#define的內存單位在法式運轉前曾經分派。
3、我們曉得,char *會存在常量區,但假如我們把char *“封裝”到一個struct裡,這時候它會同該struct分派到棧區中,也就是說,我們可以修正struct中char *裡的值。
----------------------------------------------------------------------------------------------------------------------------------------------------------
成績2:我們曾經曉得,宏本質上是調換,而函數是傳參,挪用。那末,帶參數宏與通俗函數在效力上有甚麼差別?
經由過程查閱一些材料懂得到
1、通俗函數是在法式運轉時挪用,法式會給它的成員分派內存。而帶參宏是在編譯前就曾經履行,而且不會分派內存單位。
2、宏調換不占用運轉時光,只占用編譯時光。函數則占用運轉時光。所以,假如想進步法式運轉效力,可以用宏取代部門函數。