1樓:匿名使用者
我覺得上面兩樓說得都有些偏差,與lz想要的答案有少少不一樣.
我相信lz的程式是執行在32位系統上.如果執行在64位系統上,那麼結果應該是32,而不是16.
32系統上,int為4位元組,long為4位元組,然後第9個位元組上開始排第一個char,第10個位元組上排第二個char,直到第14個位元組.而對齊記憶體後,結構的總位元組數在這裡應該是4的倍數,所以要16位元組.
這裡牽涉到記憶體對齊的問題,lz可以去找找資料.
位元組對齊的細節和具體編譯器實現相關,但一般而言,滿足三個準則:
1) 結構體變數的首地址能夠被其最寬基本型別成員的大小所整除;
2) 結構體每個成員相對於結構體首地址的偏移量都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組;
3) 結構體的總大小為結構體最寬基本型別成員大小的整數倍,如有需要編譯器會在最末一個成員之後加上填充位元組。
2樓:匿名使用者
不同的編譯器處理不同
int的大小取決於編譯器,和系統無關,16位的編譯器在32位系統上也能跑,不過是在32位系統上虛擬了一個dos,dos是16位的,所以16位編譯器中int為16位,32位編譯器在32位和64位系統上都能跑,int都為32位,所以說,編譯器決定了int的大小,而不是系統。
3樓:紫二世
int 是4 long是8 char是1 但系一般結構體的大小是os int型別的倍數 所以就是16了 根據os的不同 中間可能填充是1 也可能是3吧
c++字串長度與位元組的問題
4樓:
1、strlen函式是返回字元長度(以空字元為結束符)所以是5
2、sizeof(str);返回是指定變數佔用空間大小str是指標變數,指標大小為4,所以返回4你可以把str變成陣列
char str="12345";
此時str是陣列,所以sizeof(str)返回的是6
5樓:
strlen()函式返回不包含結束符的長度sizeof(str)得到的是型別char*的長度如果定義是:
char str="12345";
那麼sizeof(str)就是6了
6樓:匿名使用者
strlen()是求字元的長度,字串中有多少字元就輸出幾,不包括結束符『\0』;
sizeof()是求其在記憶體中的長度。
sizeof(str)=4;因為str是指標啊。所有指標都佔四個位元組。
如果要輸出6,那應該是sizeof(「12345」);
7樓:楊卓燁
你定義的是指標變數,他的sizeof(str)就是4,這是規定
要是換成陣列就不是啦,就和你想的一樣啦
8樓:匿名使用者
char str = 「12345」
char *str = "12345"
含義不同,
char str = 「12345」是字元陣列,str裡有『1』『2』『3』『4』『5』『\0』。每個字元許一個位元組,所以為 6個位元組。
char *str = "12345"含義是,指標str指向"12345",str的值是"12345"中首字元的『1』地址。
也就是說,用char *str = "12345"比char str = 「12345」
多分配了一個儲存地址的空間,用於儲存字元陣列的首地址,這個儲存空間是多大(佔有幾個位元組)?一般32位機器和現行的編譯器,指標的長度一般指定為4個位元組,記住就是了。
strlen求長度不包含『\0』。
c++ string 轉 char[] 位元組長度問題
9樓:匿名使用者
int len=aa.length();
char* bb=new char[len+1];
strcpy_s(bb,len+1,aa.c_str());
......
用完後delete bb;
10樓:月夜慕雪寒
變長的陣列應該這樣定義:
int length=strlen(aa);
char *bb;
bb=new char[length];
11樓:匿名使用者
std::string str = "you string";
char* c_str = new char[str.length() + 1]; //注意+1 還有個'\0' 啊
memset(c_str, 0, str.length() + 1);
怎麼c++裡面的string型別的位元組數
12樓:匿名使用者
不知道你是不是想看string長度 用string.length()函式可以返回字串的長度 一個字元佔一個位元組 而且string有一個字元表示結尾 這個字元不會被length計算 所以length+1就是所佔位元組 sizeof出來的數字是預設開的空間 也就是隻要定義一個string 系統就會為它分配32位元組
13樓:
string型別 -- string 不是變數型別,不叫「型別」
string是「類」,英文 class。
sizeof 是 運算子。不能算 class 佔記憶體的大小。
string類 成員函式 .length(), .size() 才能求它的字串 實際所佔的位元組數。
string類,它同 char 不一樣。char 是變數型別。
c++如何獲取位元組byte的長度?
14樓:匿名使用者
每次讀取byte陣列長度個位元組。也就是說,你byte陣列長度多少。就讀取多少到byte陣列裡
15樓:
c++中,byte其實就是unsigned char型別;
typedef unsigned char byte所以取賦值「cetest」給buf,buf的內容是的長度,直接使用for迴圈
來計算,或使用strlen函式獲取後加一(加上'\0')就可以得到其長度。
賦值的話,這樣就可以:ch = (char*)buf;
16樓:
byte buf=(byte)"cetest";導致了資料丟失,應該為byte *buf=(byte*)"cetest"。
strlen(buf)獲得長度。
c++中各種變數所佔位元組數
17樓:井鈺
樓主啊,這個不同型別的變數所佔的位元組數與你的機器有關
但是你可以通過sizeof(型別名)來確定他到底在你的機器上所佔用
的位元組數,當然型別名不侷限於基本型別,還包括很多自定義型別
如類型別了等等,結構型別了,不過那些稍微複雜一點
還可以sizeof(表示式)//表示的是表示式結構所佔用的位元組數
下面給個程式測試,樓主可以到自己電腦上試試:
#include
using namespace std;
int main()
我電腦上的執行結果顯示:
the size of an int is: 4bytes.
the size of a short int is: 2bytes.
the size of a long int is: 4bytes.
the size of a char is: 1bytes.
the size of a float is: 4bytes.
the size of a double is: 8bytes.
the size of a bool is: 1bytes.
18樓:匿名使用者
你可以條用sizeof()函式,它就是c++提供的檢視變數所佔位元組數目的函式,其中只有一個引數,可以是某個變數名,也可以是某一個資料型別,例如sizeof(int)和sizeof(a)(當然已經有:int a;)都返回4.
19樓:匿名使用者
不同的系統上,所佔空間是不同的。
可以用sizeof(型別名)來檢查對就型別所佔用的位元組數量。
c++的問題,怎樣按位元組讀取二進位制檔案?
20樓:
這個功能完全可以用 c 語言實現,你幹嗎非要用 c++ 呢?c 語言實現就足夠了。
不要為了 c++ 而寫 c++ 程式,這樣寫出來的源程式,可讀性較差。只有當問題本身確實適合用 c ++ 來描述時,再用 c ++ 寫程式,這樣才自然。而且了,在 c ++ 程式中,寫 c 語言的函式也完全沒有問題,至少這個功能你可以用 c **寫。
如果你需要對文字檔案進行讀、寫操作,用:"r" 、"w" 方式,
如果你需要對二進位制檔案進行讀、寫操作,用:"rb" 、"wb" 方式。
如果你確保每一條記錄的位元組數都完全相同,你可以使用:fread()、fwrite() 庫函式實現你的功能。
#include
void main()
if( ( fpw = fopen("target", "wb") ) == null )
fread( record, sizeof(record), 1, fpr ) ; /* 讀一條記錄 */
......
fwrite( record, sizeof(record), 1, fpw ) ; /* 寫一條記錄 */
fclose(fpr) ; fclose(fpw) ;}
21樓:匿名使用者
1、二進位制文字使用fopen函式的二進位制模式「rb」就可以開啟。對於程式來說,不管字尾名如何,檔案分為兩種型別:文字檔案和二進位制檔案。
c語言裡有一系列檔案操作函式。區分文字和二進位制檔案,需要在開啟檔案時設定不同的控制符mode的變數即可。
2、fopen的函式原型:file * fopen(const char * path,const char * mode);
fopen函式的第一個引數是檔案路徑,第二個引數是開啟方式,有以下幾種方式:
r 以只讀方式開啟檔案,該檔案必須存在。
r+ 以可讀寫方式開啟檔案,該檔案必須存在。
rb+ 讀寫開啟一個二進位制檔案,允許讀資料。
rw+ 讀寫開啟一個文字檔案,允許讀和寫。
w 開啟只寫檔案,若檔案存在則檔案長度清為0,即該檔案內容會消失。若檔案不存在則建立該檔案。
w+ 開啟可讀寫檔案,若檔案存在則檔案長度清為零,即該檔案內容會消失。若檔案不存在則建立該檔案。
a 以附加的方式開啟只寫檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾,即檔案原先的內容會被保留。(eof符保留)
a+ 以附加方式開啟可讀寫的檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾後,即檔案原先的內容會被保留。 (原來的eof符不保留)
wb 只寫開啟或新建一個二進位制檔案;只允許寫資料。
wb+ 讀寫開啟或建立一個二進位制檔案,允許讀和寫。
wt+ 讀寫開啟或著建立一個文字檔案;允許讀寫。
at+ 讀寫開啟一個文字檔案,允許讀或在文字末追加資料。
ab+ 讀寫開啟一個二進位制檔案,允許讀或在檔案末追加資料。
上述的形態字串都可以再加一個b字元,如rb、w+b或ab+等組合,加入b 字元用來告訴函式庫開啟的檔案為二進位制檔案,而非純文字檔案。
3、例程:
#include
#include
int main ()
while ((iread = fread (szbuf, 1, sizeof (szbuf), fpphoto)) > 0)
fwrite (szbuf, 1, iread, fptarget) ;
while ((iread = fread (szbuf, 1, sizeof (szbuf), fptext)) > 0)
fwrite (szbuf, 1, iread, fptarget) ;
fclose (fpphoto) ;
fclose (fptext) ;
fclose (fptarget) ;
return 0 ;}
C語言怎麼把長位元組資料向短位元組資料轉換
怎樣的長位元組 又怎樣的短位元組。型別名 變數名 把一個變數強轉為一個型別。如果要兼顧資料完整問題還要設計相應的演算法。c語言中將一個位元組資料轉換成對應十進位制數字字串 通過格式操作使任意型別的資料轉換成一個字串。如何用c語言將不足64位元組的資料轉換成64位元組的倍數 char msg 收到的訊...
在c 中,如何把位元組陣列轉換成字串
馮老師 必果學院 位元組陣列轉化為字串陣列只需要做一個判斷 檢查位元組陣列最後一個位元組是否為0,如果是,則直接複製。否則則需要追加一個為0的位元組到末位。示例 如下 char tostring char data,size t len,char str,size t strlen else ret...
儲存24 24點陣的漢字資訊,需要的位元組數是
儲存24 24 點陣的一個漢字資訊,需要的位元組數是72。每8個點所儲存空間等於1位元組,所以24 24 8 72。中文並不一定是佔兩個位元組的,具體佔多少位元組是跟具體的編碼方式相關的。比如說 gb2312 gbk gb18030 編碼是佔用兩個位元組的,但是 utf 8 編碼的話至少需要佔用三個...