gpt4 book ai didi

c - 动态分配内存时 "pointer types"有什么意义?

转载 作者:太空宇宙 更新时间:2023-11-04 00:58:19 25 4
gpt4 key购买 nike

为什么我们有指针类型?例如

int *ptr;

我知道它是为了类型安全,例如取消引用“ptr”,编译器需要知道它取消引用 ptr 以键入 int,而不是 char 或 long 等,但正如其他人在此处概述的那样 Why to specify a pointer type? ,这也是因为“我们应该知道要读取多少字节。取消引用 char 指针将意味着从内存中取出一个字节,而对于 int 可能是 4 个字节。”这就说得通了。

但是如果我有这样的东西怎么办:

typedef struct _IP_ADAPTER_INFO {
struct _IP_ADAPTER_INFO* Next;
DWORD ComboIndex;
char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4];
char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];
UINT AddressLength;
BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH];
DWORD Index;
UINT Type;
UINT DhcpEnabled;
PIP_ADDR_STRING CurrentIpAddress;
IP_ADDR_STRING IpAddressList;
IP_ADDR_STRING GatewayList;
IP_ADDR_STRING DhcpServer;
BOOL HaveWins;
IP_ADDR_STRING PrimaryWinsServer;
IP_ADDR_STRING SecondaryWinsServer;
time_t LeaseObtained;
time_t LeaseExpires;
} IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;

PIP_ADAPTER_INFO pAdapterInfo = (IP_ADAPTER_INFO *)malloc(sizeof(IP_ADAPTER_INFO));

在这里声明类型 PIP_ADAPTER_INFO 有什么意义?毕竟,不像前面的例子,我们已经为指针指向(使用malloc)分配了足够的内存,所以在这里定义类型不是多余的吗?我们将从内存中读取与分配的内存一样多的数据。

另外,旁注:以下 4 种声明之间是否存在差异或是否存在最佳实践?

PIP_ADAPTER_INFO pAdapterInfo = (IP_ADAPTER_INFO *)malloc(sizeof(IP_ADAPTER_INFO));

PIP_ADAPTER_INFO pAdapterInfo = (PIP_ADAPTER_INFO)malloc(sizeof(IP_ADAPTER_INFO));

IP_ADAPTER_INFO *pAdapterInfo = (IP_ADAPTER_INFO *)malloc(sizeof(IP_ADAPTER_INFO));

IP_ADAPTER_INFO *pAdapterInfo = (PIP_ADAPTER_INFO)malloc(sizeof(IP_ADAPTER_INFO));

最佳答案

您在这里问了两个不同的问题 - 为什么有不同的指针类型,以及为什么将指针隐藏在 typedef 后面?

不同指针类型的主要原因来自指针算法 - 如果 p 指向类型为 T 的对象,则表达式 p + 1 指向该类型的下一个对象。如果 p 指向一个 4 字节的 int,则 p + 1 指向下一个 int。如果 p 指向一个 128 字节的 struct,那么 p + 1 指向下一个 128 字节的 struct , 等等。指针是具有附加类型语义的内存地址的抽象

至于在 typedef 后面隐藏指针...

我们中的许多人(包括我自己)认为将指针隐藏在 typedef 后面是一种糟糕的风格,如果该类型的用户仍然必须知道该类型的“指针特性”(即,如果您不得不取消引用它,或者,如果您曾将 malloc/calloc/realloc 的结果分配给它,等等)。如果你试图抽象掉某些东西的“指针性”,你需要做的不仅仅是声明——你还需要提供一个完整的 API 来隐藏所有的指针操作。

关于你的最后一个问题,C 中的最佳实践是不要强制转换 malloc 的结果。 C++ 中的最佳实践是根本不使用 malloc

关于c - 动态分配内存时 "pointer types"有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50896021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com