将 void 指针转换为结构并将其移动给定大小

标签 c struct void-pointers

我得到了一个包含 3 个不同结构的二进制文件,我想将其读入我的程序。在我读取第一个结构后,我存储它的大小,然后我假设将我的 void 指针 + 第一个结构长度转换为一个 struct ip_hdr *(这是第二个结构),然后读取它的所有值。

但问题是我不明白你如何移动一个空指针。我了解到 void 指针不具有与 int 指针相同的算术规则。

我想做这样的事情:

ptr = (struct ip_hdr *)ptr) + (ethRes));

但这不起作用,我收到以下错误消息:

Expression must be a pointer to a complete object type

这是我的代码:

#pragma warning(disable: 4996)
#include <stdio.h>
#include <stdlib.h>
#include "framehdr.h"
#include <crtdbg.h>

int main()
{
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

    FILE *fileOpen = fopen("C:\\Users\\Viktor\\source\\repos\\Laboration_3\\Laboration_3\\TCPdump", "rb");


    //Pointers and variables
    struct ethernet_hdr eth;
    struct ethernet_hdr *ethPtr;
    struct ip_hdr ip;
    struct ip_hdr *ipPtr;
    struct tcp_hdr tcp;
    struct tcp_hdr *tcpPtr;

    if (fileOpen == NULL)
    {
        printf("Error\n");
    }
    else
    {
        printf("Success\n");
    }

    char ethrr[10];
    fscanf(fileOpen, "%s", ethrr);
    int length = atoi(ethrr);
    printf("Nr: %d\n", length);

    void *ptr;
    ptr = (void *)malloc(length);
    fread(ptr, sizeof(eth), 1, fileOpen);

    int ethRes = sizeof(((struct ethernet_hdr*)ptr)->dhost) +
        sizeof(((struct ethernet_hdr*)ptr)->shost) +
        sizeof(((struct ethernet_hdr*)ptr)->type);
    printf("%d\n", ethRes);
    printf("ptr1: %d\n", &ptr);

    system("pause");
    fclose(fileOpen);


    return 0;
}

我现在它坏了,但我还没有完成它。现在只需要有关指针的帮助。

最佳答案

这应该可行,假设结构与文件中的任何内容兼容(通常将结构“原始”保存到磁盘是一个坏主意,内存中结构的确切布局取决于编译器并且不够稳定用作文件格式):

const struct ip_hdr * const ip = (struct ip_hdr *) ((struct ethernet_hdr *) ptr + 1);

这会将“1”添加到 ethernet_hdr 类型的指针,无论以太网头结构的大小如何,这都会使实际指针值前进。然后将结果转换为 struct ip_hdr *

我认为这就是您想要做的。您可以通过向 char * 添加字节来实现,但这有什么意义呢?

您不能直接添加到 void 指针,因为指针算法总是以所指向的任何单位为单位,并且 void 没有大小。

关于将 void 指针转换为结构并将其移动给定大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47885796/

相关文章:

c - 如何更改字符串中的字符

另一个 header 中的 C++ 结构函数给出 "missing type specifier"

C++ 结构指针

在 C 中创建具有邻接矩阵的图

python - 在 Python swig C 包装器中取消引用指向结构成员访问的不完整类型错误的指针

将单个字节连接到字节序列

c - 在c中打印一个二维字符串数组

c++ - 指针转换/转换解决方案 将 C 升级到 C++

c - 如何在 C 中压入和弹出一个空指针

c - 使用 void 的通用交换尝试**