日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

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

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

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

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

總結(jié)

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

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