small編譯模式下定義變數
❶ 定義變數 占內存的多少
一個指針變數在內存中占兩個位元組(small模式編譯)
一個指針變數在內存中佔四個位元組(32位機器上)
一般都是32位機器的,所以四個位元組咯。
❷ 51單片機定義變數時默認是存儲到哪裡的
未顯式聲明的情況下,變數會根據Memory Model的設置,默認分配在指定的存儲區。
Small模式:默認分配在data區
Compact模式:默認分配在pdata區
Large模式:默認分配在xdata區
新建工程默認都是Small模式,所以未顯式聲明存儲區域的變數都會分配在data區的。所以才會容易出現data區擠爆、編譯器跳著腳讓你把變數分到idata區去……
❸ C語言指針變數怎麼能表示任何內存地址.
你用的是16位的編譯器吧.(比如TC之類的)
你還沒學匯編(或者計算機原理之類)的吧.
80X86CPU在16位模式下,地址是靠兩個16位的2進制數表示的.就是 段地址 和偏移量 ,它們組合成20位的實地址能定址1M的空間(具體怎麼組合,有興趣了自己在網上看看).
你選擇的編譯模式是small(TC默認的,Model Small),只有一個數據段.所以段地址固定不變(在程序運行時等於一個常數.不需要表示),所以
char *p;
sizeof(p)==2 (這是個16位的偏移量)
如果你把編譯模式改成large或者huge
這個時候 char *p;
sizeof(p)就是 4 了,它包含了段地址和偏移量.
或者不管在什麼模式下,你直接聲明一個char far *p;
可以斷定sizeof(p) 是4
這也是char near *p 和char far *p 的不同.
char far* 是包含段地址和偏移量,
char near* 則只有偏移量.
small 模式下,默認char * 就是char near*
而large模式下, 默認char * 就是 char far*
(near和far編譯器幫你加上的)
段地址和偏移量組合後只有20位,所以在實模式下直接定址只有1M空間.(注意是【直接】能尋到的空間)
如果你接觸過dos(真正的dos而不是winxp下面的cmd),你就會知道,在沒有擴展內存和擴充內存的情況下,總共可利用的內存只有1M(不管你的內存條是多少M的),定址能力不行.
最後導致用戶可以用的內存只有600K左右.
如果有興趣的話,自己找點這方面的知識看看
❹ 為什麼Keil C中idata不能用,是不是要在哪裡設置一下
的確是RAM不夠了,因為你沒有把堆棧計算進去,所以雖然看起來小於256,但實際已經溢出。
從編譯結果來看,你有好幾個函數有實體但沒有調用,這樣是很浪費RAM的,因為KEIL因此會為這些函數中的局部變數都做了保留,相當於變成了全局變數來保存,如果你不想刪除這些函數,那就教你個辦法,在程序初始化階段:
i=0;
if(i)
{
...
不需要調用的函數;
...
}
這樣就能把RAM省下來了。
記住,嵌入式編程時,任何一個RAM空間都是十分寶貴的,可不能像PC程序那樣用啊。一些對性能要求不高的變數,或使用不頻繁的變數最好定義到XDATA中去。
❺ 關於單片機內存問題,DATA和XDATA具體是怎麼樣的
選擇small 模式你定義的變數默認為data模式,即變數存放與單片機的內部ram,而large模式下,定義的變數存放於外部ram。前者運算速度快於後者。