c語言結構體內存
❶ 為什麼c語言結構體的內存大小是24
指針大小是固定的,與指向的地址內容無關,與機器位數有關。
大小等於機器位長,64位指針大小是8,32位指針大小是4。
如果編譯器設置了對齊,那麼:
64位就是 8*3=24。
32位就是4*3=12。
你再運行看看。
❷ c語言 結構體 共用體 占內存位元組
共用體:
sizeof(union
data1)的值為16.在編譯器默認設置的情況下,該共用體最大基本類型為double,它佔8位元組,所以此共用體以8來對齊。字元數組c2佔9個位元組,那麼整個共用體應該佔9個位元組,但按照對齊原則,實際分配給它的內存為16位元組。
結構體:
struct
data以8個位元組對齊,long類型的成員1分配8個位元組。s、i、c、a原本分別佔4、2、1、10個位元組。由於考慮到對齊,s分配4個位元組,i分配
2個位元組,c分配2個位元組,此時剛好用完8個位元組。a原本分配10個位元組,由於考慮到對齊,要使整個結構體所佔的存儲空間是8的倍數,所以分配給它16個位元組。因此結構體data佔8+4+4+2+16=32個位元組。
❸ C語言中結構體佔用內存大小的問題
不會,同一個結構體佔用的內存都是一樣的,
stOne和stTwo之所以不同,是因為內存對齊問題。
取內存時,是按照主機系統是多少位來取的
32位系統,每次取四個位元組
64位系統,每次取8個位元組
根據你sizeof得到的結果,你的系統是32位的,所以每次取四個位元組,而stOne char類型佔用一個,而int佔用四個,所以char類型自動佔用了4個,否則,如果char佔用一個,取得時候,去了一個char,然後去了int變數的前三個,這樣會出問題,所以,會得到你上面sizeof的結果
stTwo,就不會因為是兩個char類型挨著的,這樣兩個char類型佔用四個,取得時候先取兩個char,再取int。
❹ c語言結構體的問題,存儲空間大小
win32
4位元組對齊
變數內存的起始地址的邊界是跟它類型一致的
比如int類型,可以認為它存在4的倍數的地址,short存在2位元組倍數開始的地址,char存在1位元組開始的地址,即任意地址
因此,回過頭來看
第一個結構
假設int
a;///4位元組倍數地
short
b;//推理a的末尾是4位元組倍數地址也是2位元組倍數地址,所以b是挨著a存的
char
c;//任意其實地址,挨著b存放
看起來7個位元組就放下了,但是需要兼顧4位元組對齊的原則,在末尾補了一個位元組
第二個結構也類似
結構體與普通類型並無大區別,存儲區域也一樣的
❺ c語言結構體存儲大小
分配內存時,編譯器考慮同結構里最寬的元素類型對齊,或4 位元組對齊。
struct
{
int i; // 這里 最寬的元素類型 是 int -- 4 位元組
char b; // 所以給它分配1位元組後,再浪費3個位元組,湊成4位元組
}numb;
所以一共用8個位元組。
❻ C語言中結構體在內存中的存儲方式
結構體在內存中的存儲方式,和常規的C語言變數、常量存儲方式類似,唯的不同在於對齊。
只所以要進行數據對齊是因為編譯器對結構的存儲的特殊處理能提高CPU存儲變數的速度,一般來說,32位的CPU內存以4位元組對齊,64位的CPU的以8位元組的對齊。一般可以使用#pragma pack()來指出對齊的位元組數。比如下面的代碼,在debug會顯示結構體test的內存大小為28,如果生成release版則所佔內存大小為32 。
#include<stdio.h>
#ifdef_DEBUG
#pragmapack(4)
structtest
{
charx[13];//13
intd;//4
doublef;//8
}ss;
#else
#pragmapack(8)
structtest
{
charx[13];//13
intd;//4
doublef;//8
}ss;
#endif
intmain(void){
printf("%d ",sizeof(ss));
return0;
}
❼ C語言結構體內存空間如何分配問題
看來你是64位的機器了,64位的機器是以8位元組來排的,比如你的char name[20]要佔20個位元組,那麼內存會分配3個內存塊(暫且這么理解),是24個位元組,而double 是佔了8個位元組,這個時候給char name[20] 分配的24個位元組還剩下4個位元組,已經存不下double了,所以又開辟了一個內存塊來存double,一共32個位元組。 你把double改為int, 你會發現是佔用了24個位元組空間。不知道你能不能理解
❽ C語言結構體在內存中的分配
因為內存對齊。
為了CPU更快地定址,編譯器會進行內存對齊。
char
c1;
//分配1位元組空間
char
c2;
//分配1位元組空間
short
s;
//上面的兩個char佔用空間剛好等於一個short,不會發生對齊,分配2位元組空間
int
i;
//上面的兩個char一個short佔用空間剛好等於一個int,不會發生對齊,分配4位元組空間
因此最後結構體test2的size為8位元組
char
c1;
//分配1位元組空間
short
s;
//地址未對齊,會發生內存對齊,補齊1位元組的空間,然後再為short分配2位元組空間
char
c2;
//分配1位元組空間
int
i;
//地址未對齊,會發生內存對齊,補齊3位元組的空間,然後再為int分配4位元組空間
因此最後結構體test1的size為1+1(補齊)+2+1+3(補齊)+4=12位元組
欲知詳情,請網路「內存對齊」,這里不再詳述。
❾ C語言結構體占內存多少
C語言獲取變數、數據類型內存佔多少,使用sizeof運算符即可。
關於結構體所佔的內存多少,一般還要考慮對齊的問題。只所以要進行數據對齊是因為編譯器對結構的存儲的特殊處理能提高CPU存儲變數的速度,一般來說,32位的CPU內存以4位元組對齊,64位的CPU的以8位元組的對齊。一般可以使用#pragma pack()來指出對齊的位元組數。比如下面的代碼,在debug會顯示結構體test的內存大小為28,如果生成release版則所佔內存大小為32 。
#include<stdio.h>
#ifdef_DEBUG
#pragmapack(4)
structtest
{
charx[13];//13
intd;//4
doublef;//8
}ss;
#else
#pragmapack(8)
structtest
{
charx[13];//13
intd;//4
doublef;//8
}ss;
#endif
intmain(void){
printf("%d ",sizeof(ss));
return0;
}