關(guān)于define與C 的內(nèi)存
問題1:#define到底存在程序的哪個(gè)區(qū)?
自己寫了一個(gè)小程序驗(yàn)證一下第一個(gè)問題。
程序代碼:
<span style="font-size:18px;">#include <stdio.h>
#include <STDLIB.H>
#define kMAX 100
typedef struct {
	int ID;
	char * name;
}Student;
void test()
{
	return;
}
//常量區(qū),靜態(tài)區(qū),堆區(qū),棧區(qū),程序代碼區(qū)
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));//動(dòng)態(tài)分配內(nèi)存
	static int k = 9;
	printf("常量區(qū)\n");
	printf("const int(%p)\n",&a);
	printf("char *(%p)\n",b);
	printf("靜態(tài)區(qū)\n");
	printf("static int (%p)\n",&k);
	printf("堆區(qū)\n");
	printf("(int*)malloc(100*sizeof(int))(%p)\n",ap);
	printf("棧區(qū)\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("程序代碼區(qū)\n");
	printf("test()(%p)\n",test);
	printf("未知\n");
	printf("define (%p)\n",kMAX);
	
	free(ap);
	return 0;
}</span>
發(fā)現(xiàn):
1、通過運(yùn)行代碼可以看出程序的幾個(gè)內(nèi)存區(qū)互不相鄰;
2、#define的內(nèi)存單元在程序運(yùn)行前已經(jīng)分配。
3、我們知道,char *會(huì)存在常量區(qū),但如果我們把char *“封裝”到一個(gè)struct里,這時(shí)它會(huì)同該struct分配到棧區(qū)中,也就是說,我們可以修改struct中char *里的值。
----------------------------------------------------------------------------------------------------------------------------------------------------------
問題2:我們已經(jīng)知道,宏實(shí)質(zhì)上是替換,而函數(shù)是傳參,調(diào)用。那么,帶參數(shù)宏與普通函數(shù)在效率上有什么區(qū)別?
通過查閱一些資料了解到
1、普通函數(shù)是在程序運(yùn)行時(shí)調(diào)用,程序會(huì)給它的成員分配內(nèi)存。而帶參宏是在編譯前就已經(jīng)執(zhí)行,并且不會(huì)分配內(nèi)存單元。
2、宏替換不占用運(yùn)行時(shí)間,只占用編譯時(shí)間。函數(shù)則占用運(yùn)行時(shí)間。所以,如果想提高程序運(yùn)行效率,可以用宏代替部分函數(shù)。
上一篇:圖文詳解C語言位運(yùn)算基礎(chǔ)知識(shí)
欄 目:C語言
下一篇:簡(jiǎn)單掌握桶排序算法及C++版的代碼實(shí)現(xiàn)
本文標(biāo)題:關(guān)于define與C 的內(nèi)存
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/2182.html
您可能感興趣的文章
- 01-10全排列算法的非遞歸實(shí)現(xiàn)與遞歸實(shí)現(xiàn)的方法(C++)
 - 01-10深入理解atoi()與itoa()函數(shù)的用法
 - 01-10淺談C/C++中的static與extern關(guān)鍵字的使用詳解
 - 01-10基于atoi()與itoa()函數(shù)的內(nèi)部實(shí)現(xiàn)方法詳解
 - 01-10Linux線程管理必備:解析互斥量與條件變量的詳解
 - 01-10深入理解大數(shù)與高精度數(shù)的處理問題
 - 01-10深入理解數(shù)組指針與指針數(shù)組的區(qū)別
 - 01-10C語言游戲必備:光標(biāo)定位與顏色設(shè)置的實(shí)現(xiàn)方法
 - 01-10深入探討C語言中局部變量與全局變量在內(nèi)存中的存放位置
 - 01-10linux c 查找使用庫的cflags與libs的方法詳解
 


閱讀排行
- 1C語言 while語句的用法詳解
 - 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
 - 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
 - 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
 - 5c語言計(jì)算三角形面積代碼
 - 6什么是 WSH(腳本宿主)的詳細(xì)解釋
 - 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
 - 8正則表達(dá)式匹配各種特殊字符
 - 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
 - 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
 
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
 - 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
 - 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
 - 04-02c語言用函數(shù)寫分段 用c語言表示分段
 - 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)
 - 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
 - 04-02c語言沒有round函數(shù) round c語言
 - 04-02c語言分段函數(shù)怎么求 用c語言求分段
 - 04-02C語言中怎么打出三角函數(shù) c語言中怎
 - 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
 
隨機(jī)閱讀
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
 - 01-10C#中split用法實(shí)例總結(jié)
 - 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
 - 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
 - 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
 - 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
 - 01-10delphi制作wav文件的方法
 - 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
 - 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
 - 04-02jquery與jsp,用jquery
 


