日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C程序中变量存放方式介绍

發(fā)布時(shí)間:2025/4/16 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C程序中变量存放方式介绍 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

C語言中的局部變量都是通過棧存放的,在X86系統(tǒng)中,棧的增長方向是從高地址向低地址(對于8051單片機(jī)中,棧的增長方向是從低地址向高地址)。

下面的例子很好地證明了這一點(diǎn)

#include <stdio.h>int main() {char ch1;char ch2;short sh1;short sh2;int i1;int i2;printf("addr ch1 = %p\n", &ch1);printf("addr ch2 = %p\n", &ch2);printf("addr sh1 = %p\n", &sh1);printf("addr sh2 = %p\n", &sh2);printf("addr i1 = %p\n", &i1);printf("addr i2 = %p\n", &i2);return 0; }

多字節(jié)變量

從上面的例子中也可以看到,多字節(jié)變量的地址其實(shí)是所占據(jù)存儲空間中的低地址。比如上例中的short類型變量sh1占據(jù)了0065FEAC~0065FEAD兩個(gè)字節(jié)空間,但是sh1的地址就是0065FEAC,是低地址。

將上面的地址分布畫下來,我相信讀者應(yīng)該會(huì)有下面兩個(gè)疑惑。

1)0065FEA8~0065FEA9兩個(gè)字節(jié)為什么跳過去了呢?
2)既然有些變量占據(jù)多個(gè)地址空間,那么變量的高字節(jié)是占低地址空間還是高地址空間呢?
下面解答這兩個(gè)問題

1)這是因?yàn)榫幾g器為了提高程序執(zhí)行效率,會(huì)對程序變量進(jìn)行字節(jié)對齊。我們想一想啊。假如這個(gè)電腦是一個(gè)32位的系統(tǒng),數(shù)據(jù)總線是32位的,也就是一次可以讀取4個(gè)字節(jié)。假如i1這個(gè)變量不是存儲在4個(gè)字節(jié)對齊的空間,那么CPU為了讀取i1這個(gè)變量,就需要讀取RAM兩次。編譯器為了提高代碼的執(zhí)行效率都會(huì)對代碼進(jìn)行字節(jié)對齊。
一般對齊的原則是,這個(gè)變量的大小是幾個(gè)字節(jié),就是對齊幾個(gè)字節(jié)。對于char short int 就是1個(gè)字節(jié)對齊(不需要對齊)、2、4字節(jié)對齊。上面例子中的i1、i2變量是int類型的,因此需要對齊到4個(gè)字節(jié),因此它們需要從地址末尾為0,4,8,C開始的存儲空間開始存儲。這就解釋了為什么上面有兩個(gè)字節(jié)會(huì)跳過了。

2)這個(gè)問題的結(jié)論就是高字節(jié)放到高地址空間,低字節(jié)放到低地址空間。下面的例子可以說明這個(gè)結(jié)論。

#include <stdio.h>int main() {short i;unsigned int addr;unsigned char ch1, ch2;printf("size short %d\n", sizeof(i));printf("address short %p\n", &i);i = 0x1234;addr = (unsigned int)(&i);ch1 = *(char *)(addr);ch2 = *(char *)(addr + 1);printf("i = %x\n", i);printf("ch1 = %x\n", ch1);printf("ch2 = %x\n", ch2);return 0; }

這個(gè)例子中的變量ch1放的是short類型的變量i的低地址空間內(nèi)容,ch2放的是高地址空間內(nèi)容。i是0x1234,ch1=0x34,ch2=0x12。這就說明了變量的高字節(jié)放高地址空間的內(nèi)容,低字節(jié)放低地址空間的內(nèi)容。

順便說一下對于用C51進(jìn)行8051單片機(jī)編程的同學(xué),在8051中高字節(jié)放在低地址空間中,低字節(jié)放高地址空間中。由于8051的棧是從低地址開始向高地址延伸,似乎有一個(gè)規(guī)則,變量的高字節(jié)在棧中先存放,低字節(jié)后存放。這個(gè)規(guī)則對于x86和8051都適用,對于其他芯片是不是都成立,大家可以自己總結(jié)一下。

總結(jié)

以上是生活随笔為你收集整理的C程序中变量存放方式介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。