ページ 11

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

Posted: 2018年3月27日(火) 22:03
by しょしんにかえる
連投失礼します。自分なりにいろいろ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) で終了しました。

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

Posted: 2018年3月27日(火) 22:25
by へにっくす

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

Posted: 2018年3月27日(火) 23:50
by しょしんにかえる
#pragma pack(1)を挿入したところ、うまく動きました。ありがとうございました。