define 與 C的記憶體

2021-07-25 12:58:22 字數 1444 閱讀 7902

問題1:#define到底存在程式的哪個區?

#include 

#include

#define kmax 100

typedef struct student;

void test()

//常量區,

靜態區,堆區,棧區,程式**區

「` const int a = 100;

char * b = 「ok123」;

int main()

; int n = 9999;

int *p = &n;

int num[10] = ;

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;

發現:

1、通過執行**可以看出程式的幾個記憶體區互不相鄰

2、#define的記憶體單元在程式執行前已經分配。

3、我們知道,char 會存在常量區,但如果我們把char 「封裝」到乙個struct裡,這時它會同該struct分配到棧區中,也就是說,我們可以修改struct中char *裡的值。

問題2:我們已經知道,巨集實質上是替換,而函式是傳參,呼叫。那麼,帶引數巨集與普通函式在效率上有什麼區別?

通過查閱一些資料了解到

1、普通函式是在程式執行時呼叫,程式會給它的成員分配記憶體。而帶參巨集是在編譯前就已經執行,並且不會分配記憶體單元。

2、巨集替換不占用執行時間,只占用編譯時間。函式則占用執行時間。所以,如果想提高程式執行效率,可以用巨集代替部分函式。

C語言typedef與 define的辨析

typedef 1 使用它來為型別取乙個新的名字 2 也可以使用 typedef 來為使用者自定義的資料型別取乙個新的名字 define 定義巨集,define 是 c 指令,用於為各種資料型別定義別名,與 typedef 類似。但是它們有以下幾點不同 typedef 僅限於為型別定義符號名稱,de...

C語言筆記 define與typedef的區別

define是預處理指令,在編譯時不進行任何檢查,只進行簡單的替換 巨集定義的一般形式為 define 巨集名 字串這裡所說的字串是一般意義上的字串行,不要和c語言中的字串等同,它不需要雙引號。typedef是在c語言中用來為複雜的宣告定義簡單的別名,它本身是一種儲存類的關鍵字,與auto exte...

define用法,C語言 define詳解

c語言中,可以用 define 定義乙個識別符號來表示乙個常量。其特點是 定義的識別符號不佔記憶體,只是乙個臨時的符號,預編譯後這個符號就不存在了。預編譯又叫預處理。預編譯不是編譯,而是編譯前的處理。這個操作是在正式編譯之前由系統自動完成的。用 define 定義識別符號的一般形式為 define ...