關於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、宏調換不占用運轉時光,只占用編譯時光。函數則占用運轉時光。所以,假如想進步法式運轉效力,可以用宏取代部門函數。