wmdlinuxshell 2024-03-18 19:21 采纳率: 1.6%
浏览 808

warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]


#include <stdio.h>
#include <string.h>
#include <Windows.h>
 
#pragma pack(push, 1)
typedef struct _SMBIOS_STRUCT_HEADER {
    BYTE Type;
    BYTE Length;
    WORD Handle;
} SMBIOS_STRUCT_HEADER;
 
typedef struct _SMBIOS_STRUCT_STRING {
    SMBIOS_STRUCT_HEADER Header;
    CHAR String[1];
} SMBIOS_STRUCT_STRING;
 
typedef struct _SMBIOS_STRUCT_TABLE {
    DWORD Signature;
    BYTE Checksum;
    BYTE Length;
    BYTE MajorVersion;
    BYTE MinorVersion;
    WORD MaximumStructureSize;
    BYTE EntryPointRevision;
    BYTE FormattedArea[5];
    BYTE IntermediateAnchorString[5];
    DWORD IntermediateChecksum;
    WORD StructureTableLength;
    DWORD StructureTableAddress;
    WORD NumberOfStructures;
    BYTE BCDRevision;
} SMBIOS_STRUCT_TABLE;
#pragma pack(pop)
 
void ReadSMBIOSInformation() {
    DWORD eax_val, ebx_val, ecx_val, edx_val;
    // 调用INT 0x15的EAX=0xE820来获取SMBIOS信息
    __asm__ __volatile__(
        "xor %%eax, %%eax\n\t"
        "mov $0x534D4150, %%ebx\n\t"
        "mov %2, %%ecx\n\t"
        "mov $0x534D4150, %%edx\n\t"
        "int $0x15\n\t"
        : "=a" (eax_val), "=b" (ebx_val), "=c" (ecx_val), "=d" (edx_val)
    );
 
    // 判断是否成功获取SMBIOS信息
    if (eax_val == 0x534D4150 && edx_val == 0x5F4D735F) {
        SMBIOS_STRUCT_TABLE* smbiosTable = (SMBIOS_STRUCT_TABLE*)ebx_val;
 
        // 遍历SMBIOS结构表
        SMBIOS_STRUCT_HEADER* currentHeader = (SMBIOS_STRUCT_HEADER*)(smbiosTable->StructureTableAddress);
        for (int i = 0; i < smbiosTable->NumberOfStructures; i++) {
            // 处理每个SMBIOS结构
            switch (currentHeader->Type) {
                case 0: // BIOS信息
                    printf("BIOS Vendor: %s\n", ((SMBIOS_STRUCT_STRING*)currentHeader)->String);
                    break;
                case 1: // 系统信息
                    // 处理系统信息
                    break;
                // 其他类型的结构信息
                // ...
                default:
                    break;
            }
 
            // 指向下一个SMBIOS结构
            currentHeader = (SMBIOS_STRUCT_HEADER*)((BYTE*)currentHeader + currentHeader->Length);
        }
    }
}
 
int main() {
    ReadSMBIOSInformation();
 
    return 0;
}
![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/beebc80ff0e04dc8b0dff37473fdd0c3.png "#left")

报错如图片

  • 写回答

4条回答 默认 最新

  • 檀越@新空间 2024-03-18 19:21
    关注

    wmdlinuxshell 晚上好🌙🌙🌙
    本答案参考ChatGPT-3.5

    这个报错是由于在代码中进行了整数类型和指针类型之间的转换,而两者的大小不一致导致的。具体原因是在以下这行代码中:

    SMBIOS_STRUCT_TABLE* smbiosTable = (SMBIOS_STRUCT_TABLE*)ebx_val;
    

    ebx_val 是一个整数类型,而 SMBIOS_STRUCT_TABLE* 是一个指向结构体的指针类型。由于整数类型和指针类型的大小不一致,所以编译器会发出警告。

    为了解决这个问题,你可以进行以下操作:

    1. 明确将 ebx_val 的类型转换为一个指针类型,即 SMBIOS_STRUCT_TABLE*
    2. 使用合适的整数类型来保存指针类型的值,并确保二者的大小一致。
    3. 如果经过仔细检查确认你的代码中使用的类型是正确的,并且无需进行类型转换,请使用强制类型转换 (SMBIOS_STRUCT_TABLE*) 来告诉编译器你已经考虑到了这种类型转换。

    修改后的代码如下所示:

    SMBIOS_STRUCT_TABLE* smbiosTable = (SMBIOS_STRUCT_TABLE*)(uintptr_t)ebx_val;
    

    在这个示例中,我们使用了 uintptr_t 类型来保存 ebx_val 的值,并通过强制类型转换将其转换为 SMBIOS_STRUCT_TABLE* 类型的指针。

    解决方案总结如下:

    1. 使用合适的整数类型来保存指针值,并确保二者的大小一致。
    2. 在进行类型转换之前,仔细检查你的代码中使用的类型是否正确,并确保无需进行类型转换。
    3. 如果需要进行类型转换,请使用强制类型转换来告诉编译器你已经考虑到了这种类型转换。

    请注意,在进行类型转换时要谨慎,确保你理解代码的含义,并确保遵守语言规范。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月18日