C語言結構體之sizeof與strlen用法詳解

2021-12-28 嵌入式ARM


1.普通數據成員對齊規則:第一個數據成員放在offset為0的地方,以後每個數據成員存儲的起始位置要從該成員大小的整數倍開始(比如int在32位機為4字節,則要從4的整數倍地址開始存儲)。


2.結構體成員對齊規則:如果一個結構裡有某些結構體成員,則該結構體成員要從其內部最大元素大小的整數倍地址開始存儲。(struct a裡存有struct b,b裡有char,int,double等元素,那b應該從8的整數倍開始存儲。)


3.結構體大小對齊規則:結構體大小也就是sizeof的結果,必須是其內部成員中最大的對齊參數的整數倍,不足的要補齊。

struct node{
    char  b;
    int   a;
    short c;
};

上面結構體sizeof(struct node)=16,這是在32位系統中。為什麼下面給大家講解一下。

char   b,只是佔一個字節,但是int b是4個字節。需要對齊,所以char b也佔四個字節,short佔兩個字節,那是不是應該就是10個字節了,答案是錯誤的。滿足原則三所以字節是12. 看下面這個例子。

 

struct node{
    char  b;
    int   a;
    short c;
    struct node *next;
};

 

這個很簡單了吧,我電腦是64位系統,struct node *next;是一個地址佔8位,前面是10位,但是要滿足結構體對齊,所以字節數應該是24位。不懂得繼續追問。

 

如果我們想按一字節對齊或者2位元組對齊等,我們可以採取如下措施。

#pragma pack(push) //保存對齊狀態
#pragma pack(4)//設定為4位元組對齊
#pragma pack(pop)//恢復對齊狀態 

相關焦點

  • C/C++基礎之sizeof使用
    ,前幾天文章C語言指針詳解提到過,指針變量的位寬等於機器字長,機器字長由 CPU 寄存器位數決定。如果字符數組表示字符串,數組末自動插入 '\0',所以 c 的數據類型是 char[7] ,所以 sizeof(c)=sizeof(char[7])==7。
  • 剖析c語言結構體的高級用法(二)
    昨天分享了結構體裡面的一些常見用法(因為測試代碼測試的有點晚,有些地方沒有分享完。),今天我們來繼續分享結構體裡面的其他用法。
  • C語言中sizeof和strlen的區別是什麼
    C語言中sizeof和strlen的區別是:strlen是一個函數,用來計算指定字符串str的長度,但不包括結束字符(即null字符);而sizeof
  • 經典C語言面試題:sizeof與strlen的區別
    sizeof不能返回動態地被分配的數組的大小。2、strlen是C語言中的庫函數,所在頭文件為#include <string.h>其函數原型為unsigned int strlen(char *s); 其中s為指定的字符串。   注意:strlen只能用char *作為參數,它求的是字符串的實際長度,方法是從開始到遇到第一個'\0'結束。
  • 實例分析C語言中strlen和sizeof的區別
    操作符返回的是參數所佔的內存數,而 strlen函數返回的是參數的字符串長度,不是所佔用的內存的大小。需要注意的是,strlen函數的參數是字符串,並且必須以串結束符「\0」結尾。看看下面的代碼。從運行結果可以發現,strlen和sizeof之間的區別在於,通過sizeof操作符得到的是定義的字符數組str佔用的內存大小,而通過strlen函數得到的是對其進行初始化的字符長度。
  • 一起學習C/C++ (7) 分辨sizeof和strlen
    所以其實你進行的還是對指針的sizeof,結果依然是4。2.strlenstrlen()函數,它是一個字符串函數,它相當於一個計數器,當它遇到』\0』時就停止計數。 ";    char arr2[] = { 'a', 'b', 'c','d', 'e', 'f' };    int a[] = { 1, 2, 3, 4 };    printf("%d\n",sizeof(p));    printf("%d\n",sizeof(arr1));    printf("%d\n",sizeof(arr2));
  • C語言結構體(struct)詳解
    schangeable *pchangeable = (schangeable *)malloc(sizeof(schangeable) + 10*sizeof(char));  13.         printf("size of pchangeable : %d\n",sizeof(pchangeable));  14.
  • 初識C語言
    結構體初識C語言初識C語言,簡單介紹了C語言的各項內容,做到認識心中有數即可,不作過多研究。strlen是字符串庫函數,傳入字符串名strlen(a)可以計算該字符串長度並返回。具體是從開頭到\0的位置,\0不算作字符串元素。
  • 理解c語言的sizeof
    c語言有很多用起來需要特別注意的地方,我們(計算機學習微信公眾號:jsj_xx)以後會分析其中有使用價值的點。今天我們一起看看sizeof。
  • C語言:關於 sizeof
    不解,自己嘗試著編寫了一個例子,果然出現這個錯誤:錯誤:invalid application of 'sizeof' to incomplete type 'int[]'例子如:f1.h:extern int array[];extern int size;int array2[10];f1.c:
  • C語言結構體、枚舉以及位域的講解
    >C語言編寫實用小工具,任意進位數轉換【附源碼】【必讀】百行C語言代碼實現簡易版通訊錄,完成增刪改查功能【附源碼】【必讀】使用C語言寫一個簡易版掃雷小遊戲【必讀】結構體1、結構體的定義 如果省略結構體名,則稱之為無名結構體,這種情況常常出現在函數內部。
  • C語言結構體常見方法
    (schangeable));            schangeable *pchangeable = (schangeable *)malloc(sizeof(schangeable) + 10*sizeof(char));          printf("size of pchangeable : %d\n",sizeof(pchangeable)
  • C語言結構體常見寫法及用法
    關注+星標公眾號,不錯過精彩內容作者
  • 【C語言經典編程技術】C語言中union與struct的區別及sizeof的計算方式
    C語言中union與struct的區別在C語言中結構體和聯合具有細微差別,特別是使用sizeof()對其求大小時,許多剛剛接觸
  • C語言之結構體(struct)
    long、unsigned int 、short、char (相當於各種文件類型,比如 .txt、.c、.h)這些關鍵字是否很熟悉?這都是 C 語言定義好的數據類型,直接拿來用就行了。但是我想自定義一個別的類型的數據怎麼辦?就靠 struct 了。
  • 為什麼C語言中的結構體的size,並不等於它所有成員size之和?
    結構體在C語言程序開發中,是不可或缺的語法。不過,相信不少C語言初學者遇到過這樣的問題:為什麼結構體的 size 有時不等於它的所有成員的 size 之和呢?舉例來說,假設有結構體,它的C語言代碼如下,請看:struct x{short s; int i; char c;};我們繼續編寫C語言代碼
  • 指向結構體的指針
    在C語言中幾乎可以創建指向任何類型的指針,包括用戶自定義的類型。創建結構體指針是極常見的。*r是一個結構體,像任何其他Rec類型的結構體一樣。下面的代碼顯示了這個指針變量的典型用法:strcpy((*r).name, "Leigh");strcpy((*r).city, "Raleigh");strcpy((*r).state, "NC");printf("%sn", (*r).city);free(r);您可以像對待一個普通結構體變量那樣對待*r,但在遇到C的操作符優先級問題時要小心
  • 【C進階】拿著"sizeof這些用法和坑"去吹牛吧!
    本文跟大家分享的是C
  • C/C++刁鑽問題各個擊破之細說sizeof
    概述:Sizeof是C/C++中的關鍵字,它是一個運算符,其作用是取得一個對象(數據類型或者數據對象)的長度(即佔用內存的大小,以byte為單位)。其中類型包含基本數據類型(不包括void)、用戶自定義類型(結構體、類)、函數類型。數據對象是指用前面提到的類型定義的普通變量和指針變量(包含void指針)。不同類型
  • C語言之結構體最全面總結
    學號:20191102姓名:Joy入學時間:2019/9/8學制:5畢業時間:2024傳遞指向結構體變量的指針早期的C語言是不允許直接將結構體作為參數直接傳遞進去的。主要是考慮到如果結構體的內存佔用太大,那麼整個程序的內存開銷就會爆炸。不過現在的C語言已經放開了這方面的限制。