【发布时间】:2018-06-01 19:39:27
【问题描述】:
我得到了一个包含 3 个不同结构的二进制文件,我想将它们读入我的程序。读完第一个结构后,我存储它的大小,然后我想将我的 void 指针 + 第一个结构长度转换为 struct ip_hdr * (这是第二个结构),然后读取它的所有值。
但问题是我不明白您如何移动 void 指针。我知道 void 指针没有与 int 指针相同的算术规则。
我想做这样的事情:
ptr = (struct ip_hdr *)ptr) + (ethRes));
但这不起作用,而是我收到以下错误消息:
表达式必须是指向完整对象类型的指针
这是我的代码:
#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;
}
我现在它坏了,但我还没有完成它。现在只需要指针方面的帮助。
【问题讨论】:
-
请不要描述您的代码,但要显示它。
-
但这行不通。 解释不多!此外,您在
ptr = (struct ip_hdr *)ptr) + (sizeOfFirstStruct));中缺少括号(请发布您的代码。 -
@Gaurav 那我该怎么做呢?我应该先将指针投射到结构 Ip_hdr 然后移动它还是可以使用 fseek 之类的函数以某种方式移动它?
-
您发布的代码中的
ptr = (struct ip_hdr *)ptr) + (sizeOfFirstStruct));在哪里? -
ptr = (struct ip_hdr *)ptr) + (sizeOfFirstStruct));错了,请确认确实是ptr = ((struct ip_hdr *)ptr) + sizeOf(FirstStruct);。永远不要重新输入有问题的代码,而是复制/粘贴它。
标签: c struct void-pointers