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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

status c语言_STM32 嵌入式C语言教程--第四课C语言中的存储空间与位域

發(fā)布時間:2023/12/15 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 status c语言_STM32 嵌入式C语言教程--第四课C语言中的存储空间与位域 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)容,希望文章能夠幫你解決所遇到的問題。

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