我得到了一个包含 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/