status c语言_STM32 嵌入式C语言教程--第四课C语言中的存储空间与位域
1.存儲空間--堆和棧的區(qū)別
一個由C/C++編譯的程序占用的內(nèi)存分為以下幾個部分
1、棧區(qū)(stack)— 由編譯器自動分配釋放 ,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。
2、堆區(qū)(heap) — 一般由程序員分配釋放, 若程序員不釋放,程序結(jié)束時可能由OS回收 。注意它與數(shù)據(jù)結(jié)構(gòu)中的堆是兩回事,分配方式倒是類似于鏈表,呵呵。
3、全局區(qū)(靜態(tài)區(qū))(static)—,全局變量和靜態(tài)變量的存儲是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域, 未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。 - 程序結(jié)束后由系統(tǒng)釋放。
4、文字常量區(qū) —常量字符串就是放在這里的。 程序結(jié)束后由系統(tǒng)釋放
5、程序代碼區(qū)—存放函數(shù)體的二進制代碼。
例子:
#include
int a = 0;//全局初始化區(qū)
char *p1;//全局未初始化區(qū)
void main()
{
int b;棧
char s[] = "abc";//棧
char *p2;棧
char *p3 = "123456"; //1234560在常量區(qū),p3在棧上。
static int c =0; //全局(靜態(tài))初始化區(qū)
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);//分配得來得10和20字節(jié)的區(qū)域就在堆區(qū)。
strcpy(p1, "123456"); //1234560放在常量區(qū),編譯器可能會將它與p3所指向的"123456"優(yōu)化成一個地方。
}
注意:i++和++i單獨時,沒有區(qū)別。當作為右值時,i++是先賦值后加,而++i是先加后賦值。
棧空間的分配問題
如:
void fun(int a,int b)
{
int c; //棧
int d; //棧
} //在棧區(qū)的存儲順序是c,d,a,b; //分配順序就是:順序局部變量、順序參數(shù)
注意:for循環(huán)中應(yīng)該遵循左閉右開的區(qū)間規(guī)則
2.C 位域
如果程序的結(jié)構(gòu)中包含多個開關(guān)量,只有 TRUE/FALSE 變量,如下:
struct{
unsigned int widthValidated;
unsigned int heightValidated;} status;
這種結(jié)構(gòu)需要 8 字節(jié)的內(nèi)存空間,但在實際上,在每個變量中,我們只存儲 0 或 1。在這種情況下,C 語言提供了一種更好的利用內(nèi)存空間的方式。如果您在結(jié)構(gòu)內(nèi)使用這樣的變量,您可以定義變量的寬度來告訴編譯器,您將只使用這些字節(jié)。例如,上面的結(jié)構(gòu)可以重寫成:
struct{
unsigned int widthValidated : 1;
unsigned int heightValidated : 1;} status;
現(xiàn)在,上面的結(jié)構(gòu)中,status 變量將占用 4 個字節(jié)的內(nèi)存空間,但是只有 2 位被用來存儲值。如果您用了 32 個變量,每一個變量寬度為 1 位,那么 status 結(jié)構(gòu)將使用 4 個字節(jié),但只要您再多用一個變量,如果使用了 33 個變量,那么它將分配內(nèi)存的下一段來存儲第 33 個變量,這個時候就開始使用 8 個字節(jié)。讓我們看看下面的實例來理解這個概念:
實例
#include
#include /* 定義簡單的結(jié)構(gòu) */
struct {
unsigned int widthValidated;
unsigned int heightValidated;
} status1; /* 定義位域結(jié)構(gòu) */
struct {
unsigned int widthValidated : 1;
unsigned int heightValidated : 1;
} status2;
int main( ) {
printf( "Memory size occupied by status1 : %d", sizeof(status1));
printf( "Memory size occupied by status2 : %d", sizeof(status2));
return 0;
}
當上面的代碼被編譯和執(zhí)行時,它會產(chǎn)生下列結(jié)果:
Memory size occupied by status1 : 8Memory size occupied by status2 : 4
位域聲明
在結(jié)構(gòu)內(nèi)聲明位域的形式如下:
struct{
type [member_name] : width ;};
下面是有關(guān)位域中變量元素的描述:
元素
描述
type
只能為 int(整型),unsigned int(無符號整型),signed int(有符號整型) 三種類型,決定了如何解釋位域的值。
member_name
位域的名稱。
width
位域中位的數(shù)量。寬度必須小于或等于指定類型的位寬度。
帶有預定義寬度的變量被稱為位域。位域可以存儲多于 1 位的數(shù),例如,需要一個變量來存儲從 0 到 7 的值,您可以定義一個寬度為 3 位的位域,如下:
struct{
unsigned int age : 3;} Age;
上面的結(jié)構(gòu)定義指示 C 編譯器,age 變量將只使用 3 位來存儲這個值,如果您試圖使用超過 3 位,則無法完成。讓我們來看下面的實例:
實例
#include
#include
struct {
unsigned int age : 3;
} Age;
int main( )
{
Age.age = 4;
printf( "Sizeof( Age ) : %d", sizeof(Age) );
printf( "Age.age : %d", Age.age );
Age.age = 7;
printf( "Age.age : %d", Age.age );
Age.age = 8; // 二進制表示為 1000 有四位,超出
printf( "Age.age : %d", Age.age );
return 0;
}
當上面的代碼被編譯時,它會帶有警告,當上面的代碼被執(zhí)行時,它會產(chǎn)生下列結(jié)果:
Sizeof( Age ) : 4
Age.age : 4
Age.age : 7
Age.age : 0
未完待續(xù)........
總結(jié)
以上是生活随笔為你收集整理的status c语言_STM32 嵌入式C语言教程--第四课C语言中的存储空间与位域的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 消息称 SK 海力士第 5 代 1β 工
- 下一篇: UE4如何贴混合贴图_UE4[蓝图]动态