① 關於c語言結構體類型的大小
這樣才是你的結果
#pragma pack(1)
struct stu
{
}
#pragma pack()
② c語言結構體存儲大小
分配內存時,編譯器考慮同結構里最寬的元素類型對齊,或4 位元組對齊。
struct
{
int i; // 這里 最寬的元素類型 是 int -- 4 位元組
char b; // 所以給它分配1位元組後,再浪費3個位元組,湊成4位元組
}numb;
所以一共用8個位元組。
③ C語言,結構體數組的長度
C語言不支持動態分配內存,你需要自己分配,大概這樣
#include<stdio.h>
#include<stdlib.h>
typdef struct Node
{
int value;
int next;
}Node;
int main()
{
int a;
scanf("%d",&a);
Node *p=malloc(a*sizeof(Node));
.......
}
這樣p就相當於Node數組的第一個元素的指針,也可以當作數組名使用了。
④ c語言的結構體類型的長度怎麼求
strlen是求字元串長度,遇到\0認為該字元串已結束
⑤ c語言的結構體類型的長度
strlen是求字元串長度的,string length的縮寫嘛
你想求大小的話,可以用sizeof(card);
結構體的大小可是一個非常讓人頭痛的問題啊。。。我反正還是經常對自己的判斷不太肯定
我從別的地方給你找了一個說明,你可以參考一下
在預設對齊下我先給你說下三條准則吧,
【1】結構體變數的首地址能夠被其最寬基本類型成員的大小所整除
【2】結構體每個成員相對於結構體首地址的偏移量是成員大小的整數背
【3】結構體的總大小為結構體最寬基本類型成員大小的整數背
以上都是結構體中只有基本類型時的預設對齊方式,當有嵌套復合成員時,
【2】改為:復合成員相對於結構體首地址偏移量是復合成員最寬基本類型大小的整數背
所以分析你上面的
typedef struct node
{
int a[100];
char b;
}kkk;
先是第一成員400個位元組,然後還有個char一個位元組,為了滿足第第三條准則,即總大小401為最寬基本類型的整數背,明顯401不是最寬基本類型int(4)的整數背,所以總大小為404
希望樓主能理解,呵呵
⑥ C結構體存儲和長度
個參數:
#pragma pack(8); //這個8是結構體默認的對齊參數,其作用是:
1>當結構體中有變數類型占的長度比這個大,那麼該結構的對齊參數就是8;
2>如果結構體中成員的類型都比這個默認值小,那麼該結構體的對齊參數就是該結構體中佔用空間最長的成員變數的長度,如instruct A;的對齊長度是1(字元變數佔1個位元組)
根據樓主的輸出,樓主的運行環境pack(4),因為A中double占的字元大於4,所以結構體A的對齊參數為4,那麼結果就是4+4+4,實際後面兩個4是存一個double數據;第二題int a;已經等於4,所以對齊變數為4。
當知道對齊規則後,那麼內存是怎麼排列的呢?
定義變數的時候先找到一個內存地址,根據計算機的內部結構(我還不是很清楚),會選用一個可用的,而且對對齊變數求余為0的地址作為存儲該結構體的地址。
如2題既然對齊變數為4,那麼一定會選一個4的整數倍的地址作為存儲這個結構體的起始地址,
然後是10個char類型,佔10個位元組,此時,下面的地址已經不能整除4了,比如8+10=18已經不能整除4,所以會空2個位元組,從20開始存儲int,正好4個位元組,地址變為24,能被4整除,也就是char s[10]和int a,佔用了12(有2個空位元組)+4=16個位元組,由於int a後的地址能被4整除,所以A K,的長度就是A的長度為12,所以B的長度為28。
你可以#pragma pack(8);來修改默認的對齊參數來測試。
⑦ c語言關於結構體長度的問題
. 結構體的sizeof這是初學者問得最多的一個問題,所以這里有必要多費點筆墨。讓我們先看一個結構體:struct S1{char c;int i;};問sizeof(s1)等於多少聰明的你開始思考了,char佔1個位元組,int佔4個位元組,那麼加起來就應該是5。是這樣嗎你在你機器上試過了嗎也許你是對的,但很可能你是錯的!VC6中按默認設置得到的結果為8。Why為什麼受傷的總是我請不要沮喪,我們來好好琢磨一下sizeof的定義——sizeof的結果等於對象或者類型所佔的內存位元組數,好吧,那就讓我們來看看S1的內存分配情況:S1 s1 = { 'a', 0xFFFFFFFF };定義上面的變數後,加上斷點,運行程序,觀察s1所在的內存,你發現了什麼以我的VC6.0為例,s1的地址為0x0012FF78,其數據內容如下:0012FF78: 61 CC CC CC FF FF FF FF發現了什麼怎麼中間夾雜了3個位元組的CC看看MSDN上的說明:When applied to a structure type or variable, sizeof returns the actual size, which may include padding bytes inserted for alignment.原來如此,這就是傳說中的位元組對齊啊!一個重要的話題出現了。為什麼需要位元組對齊計算機組成原理教導我們這樣有助於加快計算機的取數速度,否則就得多花指令周期了。為此,編譯器默認會對結構體進行處理(實際上其它地方的數據變數也是如此),讓寬度為2的基本數據類型(short等)都位於能被2整除的地址上,讓寬度為4的基本數據類型(int等)都位於能被4整除的地址上,以此類推。這樣,兩個數中間就可能需要加入填充位元組,所以整個結構體的sizeof值就增長了。讓我們交換一下S1中char與int的位置:struct S2{int i;char c;};看看sizeof(S2)的結果為多少,怎麼還是8再看看內存,原來成員c後面仍然有3個填充位元組,這又是為什麼啊別著急,下面總結規律。位元組對齊的細節和編譯器實現相關,但一般而言,滿足三個准則:1) 結構體變數的首地址能夠被其最寬基本類型成員的大小所整除;2) 結構體每個成員相對於結構體首地址的偏移量(offset)都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組(internal adding);3) 結構體的總大小為結構體最寬基本類型成員大小的整數倍,如有需要編譯器會在最末一個成員之後加上填充位元組(trailing padding)。對於上面的准則,有幾點需要說明:1) 前面不是說結構體成員的地址是其大小的整數倍,怎麼又說到偏移量了呢因為有了第1點存在,所以我們就可以只考慮成員的偏移量,這樣思考起來簡單。想想為什麼。結構體某個成員相對於結構體首地址的偏移量可以通過宏offsetof()來獲得,這個宏也在stddef.h中定義,如下:#define offsetof(s,m) (size_t)&(((s *)0)->m)例如,想要獲得S2中c的偏移量,方法為size_t pos = offsetof(S2, c);// pos等於4
⑧ 請問一下:在c語言中結構體數組的最大長度是多少
定義在全局范圍內,就是堆分配,只和系統限制有關及內存有關
在局部的話(如子函數內),就和棧有關,一般有限制的
⑨ C語言--結構體大小
這與編譯器的編譯選項有關,如果按C語言的本意則結果應為401,但很多編譯器都對結構類型的成員變數進行了按4位元組或8位元組對齊,這樣做可以提高數據存儲速度,對齊後結構的大小就只能是4或8的整數倍。
⑩ C語言結構體及長度問題
a四位元組對齊,所以應該是16
b是指針,就是4個位元組
你那個答案是16位機器,現在上哪找去。。