這裡蒐索程式師資訊,查找有用的技術資料
當前位置:首頁 » 服務存儲 » 結構體的存儲規則
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

結構體的存儲規則

發布時間: 2022-04-08 02:50:30

A. 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);來修改默認的對齊參數來測試。

B. 請問:c語言中結構體成員在電腦中是如何存儲的

是在一塊連續的內存區中為每個成員變數都分配內存的,結構體所佔用內存的大小是所有成員變數的內存和,如果想節約內存建議使用共用體,共用體所佔內存為最大成員變數的內存大小

C. 什麼是「結構體的方式」存儲

如果你用數組,那麼數組的元素就應該是結構體類型(struct)

先定義 struct name
{
double 運算數;
char 運算符;
}

聲明數組 name[] array_XX;

D. 關於結構體變數和結構體的存儲問題

程序分配的空間有代碼段和數據段
代碼段放的是你的程序,,,,,
數據段分為堆和棧還有靜態數據區,,
堆是malloc出來的內存
棧是函數裡面分配的內存
靜態的就是全局變數以及STATIC的變數

只要是在函裡面定義的變數就是在棧裡面
malloc出來的內存是堆裡面的
這樣 懂了吧
你定義的結構體在沒定義變數之前只在代碼段放著 只有變數會放在數據段
pt,a這兩個都是棧裡面 pt指向的內存地址是堆裡面的,,,,

E. 結構體在內存中是如何存儲的

在c++中是不給類分配空間的,只在創建對象的時候才給對象分配空間
在c語言中結構體所佔的內存就等於結構體中所有變數所佔的內存的總和

F. 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;
}

G. c語言結構體存儲大小

分配內存時,編譯器考慮同結構里最寬的元素類型對齊,或4 位元組對齊。
struct
{
int i; // 這里 最寬的元素類型 是 int -- 4 位元組
char b; // 所以給它分配1位元組後,再浪費3個位元組,湊成4位元組
}numb;
所以一共用8個位元組。

H. 數據結構的存儲方式有哪幾種

數據結構的存儲方式有順序存儲方法、鏈接存儲方法、索引存儲方法和散列存儲方法這四種。

1、順序存儲方式:順序存儲方式就是在一塊連續的存儲區域一個接著一個的存放數據,把邏輯上相連的結點存儲在物理位置上相鄰的存儲單元里,結點間的邏輯關系由存儲單元的鄰接掛安息來體現。順序存儲方式也稱為順序存儲結構,一般採用數組或者結構數組來描述。

2、鏈接存儲方法:它比較靈活,其不要求邏輯上相鄰的結點在物理位置上相鄰,結點間的邏輯關系由附加的引用欄位表示。一個結點的引用欄位往往指導下一個結點的存放位置。鏈接存儲方式也稱為鏈接式存儲結構,一般在原數據項中增加應用類型來表示結點之間的位置關系。

3、索引存儲方法:除建立存儲結點信息外,還建立附加的索引表來標識結點的地址。它細分為兩類:稠密索引:每個結點在索引表中都有一個索引項,索引項的地址指示結點所在的的存儲位置;稀疏索引:一組結點在索引表中只對應一個索引項,索引項的地址指示一組結點的起始存儲位置。

4、散列存儲方法:就是根據結點的關鍵字直接計算出該結點的存儲地址。

(8)結構體的存儲規則擴展閱讀

順序存儲和鏈接存儲的基本原理

在順序存儲中,每個存儲空間含有所存元素本身的信息,元素之間的邏輯關系是通過數組下標位置簡單計算出來的線性表的順序存儲,若一個元素存儲在對應數組中的下標位置為i,則它的前驅元素在對應數組中的下標位置為i-1,它的後繼元素在對應數組中的下標位置為i+1。

在鏈式存儲結構中,存儲結點不僅含有所存元素本身的信息,還含有元素之間邏輯關系的信息。數據的鏈式存儲結構可用鏈接表來表示。其中data表示值域,用來存儲節點的數值部分。Pl,p2,…,Pill(1n≥1)均為指針域,每個指針域為其對應的後繼元素或前驅元素所在結點的存儲位置。

在數據的順序存儲中,由於每個元素的存儲位置都可以通過簡單計算得到,所以訪問元素的時間都相同;而在數據的鏈接存儲中,由於每個元素的存儲位置保存在它的前驅或後繼結點中,所以只有當訪問到其前驅結點或後繼結點後才能夠按指針訪問到,訪問任一元素的時間與該元素結點在鏈式存儲結構中的位置有關。

I. c++中的結構體如何存儲

C/C++中結構體的存儲方式
結構體在內存的存放,遵循兩個原則:
1、基本類型對齊原則:
Char
1
Short
2
Int
4
Long
4
Float
4
Double
8
2、結構體類型對齊原則:
以最大成員類型的對齊方式為准,即當需要增長時,增長最大成員類型所佔用的位元組數。
例子:vc.net2003下運行結果
#include
<iostream>
using
namespace
std;
struct
A
{
char
c1;
char
c2;
};
/*與A比較發現,當只有char類型時,以1個位元組的速度增長*/
struct
B
{
char
c1;
char
c2;
char
c3;
};
struct
C
{
char
c1;
char
c2;
short
s;
};
/*與C比較發現,當引入short類型後,以2個位元組的速度增長*/
struct
D
{
char
c1;
short
s;
char
c3;
};
struct
E
{
char
c;
short
s;
int
i;
};
/*與E比較發現,當引入int類型後,以4個位元組的速度增長*/
struct
F
{
char
c;
int
i;
short
s;
};
struct
G
{
int
i;
char
c1;
char
c2;
short
s;
};
/*與G比較發現,short類型是以2的倍數來對齊的*/
struct
H
{
int
i;
char
c1;
short
s;
char
c2;
};
int
main()
{
cout
<<
"size
of
A
:
"
<<
sizeof(A)
<<
endl;
/*2位元組*/
cout
<<
"size
of
B
:
"
<<
sizeof(B)
<<
endl;
/*3位元組*/
cout
<<
"size
of
C
:
"
<<
sizeof(C)
<<
endl;
/*4位元組*/
cout
<<
"size
of
D
:
"
<<
sizeof(D)
<<
endl;
/*6位元組*/
cout
<<
"size
of
E
:
"
<<
sizeof(E)
<<
endl;
/*8位元組*/
cout
<<
"size
of
F
:
"
<<
sizeof(F)
<<
endl;
/*12位元組*/
cout
<<
"size
of
G
:
"
<<
sizeof(G)
<<
endl;
/*8位元組*/
cout
<<
"size
of
H
:
"
<<
sizeof(H)
<<
endl;
/*12位元組*/
char
c;
cin
>>
c;
return
0;
}

J. c語言結構體的存儲

書上寫的 fread(&student[i],sizeof(struct studnt ),1,fp)
這里書上應該是一個靜態鏈表,所以才有了student[i]這樣的變數,事實上&是有必要的,因為fread第一個參數要求地址,結構體名不是地址
void store (struct student *head)
{
int a;
FILE *fp;
fp=fopen("student.date","wb");
fscanffp,"%d",a);
struct student *P =(struct student *) malloc(sizeof(struct student ));
P->data = a;
P->next = head->next;
head->next = P;
}