sizeof(...)の戻り値がおかしい?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
しょしんにかえる

sizeof(...)の戻り値がおかしい?

#1

投稿記事 by しょしんにかえる » 6年前

連投失礼します。自分なりにいろいろDebugしていたところ、次のようなコードで戻り値が同じになることを発見いたしました。(トピックを統合するかどうか迷いましたが、全く別の話題を扱うため、トピックを分けさせていただきました。)

sizeof()にかける構造体の_fNameLenを32bit->16bit(4byte->2byte)に変えたものの同じ戻り値が返る、というものです。
1.

コード:

// BoostTest.cpp : アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"

namespace zip
{

using ub2 = uint16_t;
using ub4 = uint32_t;

typedef struct _tagLocalFileHeader
{
	ub4 _signature; //0x504b0304
	ub2 _verNeeded;
	ub2 _bitFlags;
	ub2 _lastModTime;
	ub2 _lastModDate;
	ub4 _crc32;
	ub4 _compSize;
	ub4 _unCompSize;
	ub2 _fNameLen;
	ub2 _exFieldLen;
}LocalFileHeader;

typedef struct _tagCentralDirectory
{
	ub4 _signature; //0x504b0102
	ub2 _VerMadeBy;
	ub2 _VerNeeded;
	ub2 _bitFlags;
	ub2 _method;
	ub2 _lastModTime;
	ub2 _lastModDate;
	ub4 _crc32;
	ub4 _compSize;
	ub4 _unCompSize;
	ub4 _fNameLen;
	ub4 _exFieldLen;
	ub4 _fCommentLen;
	ub2 _diskNumberStart;
	ub2 _infAtt;
	ub4 _exfAtt;
	ub4 _offset;
}CentralDirectory;

class zip_entry
{

};

}


int main()
{
	auto path = "C:\\Games\\Minecraft\\1.12.2\\ic\\mods\\CutAllSMP_v2.5.2.zip";

	return sizeof(zip::CentralDirectory);
}
出力1(長いので格納)
オフトピック
'BoostTest.exe' (Win32): 'C:\Users\[********]\source\repos\BoostTest\Debug\BoostTest.exe' が読み込まれました。シンボルが読み込まれました。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\ntdll.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\kernel32.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\KernelBase.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\vcruntime140d.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\ucrtbased.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\tmumh\20019\AddOn\7.0.0.1137\TmUmEvt.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\psapi.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\shlwapi.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\advapi32.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\msvcrt.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\combase.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\user32.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\gdi32.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\sechost.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\rpcrt4.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\sspicli.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\cryptbase.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\bcryptprimitives.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\imm32.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\msctf.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\tmumh\20019\TmMon\2.5.0.2070\tmmon.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
スレッド 0x1d60 はコード 52 (0x34) で終了しました。
スレッド 0x1ba4 はコード 52 (0x34) で終了しました。
スレッド 0x2098 はコード 52 (0x34) で終了しました。
プログラム '[7432] BoostTest.exe' はコード 52 (0x34) で終了しました。

コード:

// BoostTest.cpp : アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"

namespace zip
{

using ub2 = uint16_t;
using ub4 = uint32_t;

typedef struct _tagLocalFileHeader
{
	ub4 _signature; //0x504b0304
	ub2 _verNeeded;
	ub2 _bitFlags;
	ub2 _lastModTime;
	ub2 _lastModDate;
	ub4 _crc32;
	ub4 _compSize;
	ub4 _unCompSize;
	ub2 _fNameLen;
	ub2 _exFieldLen;
}LocalFileHeader;

typedef struct _tagCentralDirectory
{
	ub4 _signature; //0x504b0102
	ub2 _VerMadeBy;
	ub2 _VerNeeded;
	ub2 _bitFlags;
	ub2 _method;
	ub2 _lastModTime;
	ub2 _lastModDate;
	ub4 _crc32;
	ub4 _compSize;
	ub4 _unCompSize;
	ub2 _fNameLen; //ここ(ub4->ub2)
	ub4 _exFieldLen;
	ub4 _fCommentLen;
	ub2 _diskNumberStart;
	ub2 _infAtt;
	ub4 _exfAtt;
	ub4 _offset;
}CentralDirectory;

class zip_entry
{

};

}


int main()
{
	auto path = "C:\\Games\\Minecraft\\1.12.2\\ic\\mods\\CutAllSMP_v2.5.2.zip";

	return sizeof(zip::CentralDirectory);
}
出力
オフトピック
'BoostTest.exe' (Win32): 'C:\Users\[*****]\source\repos\BoostTest\Debug\BoostTest.exe' が読み込まれました。シンボルが読み込まれました。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\ntdll.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\kernel32.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\KernelBase.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\vcruntime140d.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\ucrtbased.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\tmumh\20019\AddOn\7.0.0.1137\TmUmEvt.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\psapi.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\shlwapi.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\advapi32.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\msvcrt.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\combase.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\user32.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\gdi32.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\sechost.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\rpcrt4.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\sspicli.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\cryptbase.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\bcryptprimitives.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\imm32.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\msctf.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
'BoostTest.exe' (Win32): 'C:\Windows\SysWOW64\tmumh\20019\TmMon\2.5.0.2070\tmmon.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
スレッド 0x1ca8 はコード 52 (0x34) で終了しました。
スレッド 0x21f8 はコード 52 (0x34) で終了しました。
スレッド 0x23f0 はコード 52 (0x34) で終了しました。
プログラム '[2900] BoostTest.exe' はコード 52 (0x34) で終了しました。

アバター
へにっくす
記事: 634
登録日時: 11年前
住所: 東京都

Re: sizeof(...)の戻り値がおかしい?

#2

投稿記事 by へにっくす » 6年前

written by へにっくす

しょしんにかえる

Re: sizeof(...)の戻り値がおかしい?

#3

投稿記事 by しょしんにかえる » 6年前

#pragma pack(1)を挿入したところ、うまく動きました。ありがとうございました。

返信

“C言語何でも質問掲示板” へ戻る