gpt4 book ai didi

c - 通过指针递增读取作为 void* 传递的 char 数组,然后读取为 char 和其他数据类型?

转载 作者:太空宇宙 更新时间:2023-11-04 06:15:51 24 4
gpt4 key购买 nike

所以为了消除标题中的误解(不确定如何在标题中提出问题)我想从文件(字符数组)中读取,将其作为 void* 传递,所以我可以通过递增指针来读取不可靠的数据类型。所以这是我想用 C 代码做的一个简单示例:

char input[] = "D\0\0Ckjh\0";
char* pointer = &input[0]; //lets say 0x00000010
char type1 = *pointer; //should be 'D'
pointer += sizeof(char); //0x00000020
uint16_t value1 = *(uint16_t*)pointer; //should be 0
pointer += sizeof(uint16_t); //0x00000040
char type2 = *pointer; //should be 'C'
pointer += sizeof(char); //0x00000050
uint32_t value2 = *(uint32_t*)pointer; //should be 1802135552

这只是出于教育目的,所以我只想知道是否有可能,或者是否有办法实现相同的目标或类似的目标。也很高兴知道这个速度。只保留数组并在读取字符时对字符进行位移会更快吗?还是这实际上更快?

编辑:编辑c代码并将void*更改为char*;

最佳答案

这在两个方面是错误的:

  1. void不完整类型无法完成不完整类型 是没有已知大小 的类型。为了进行指针运算,必须知道大小。 取消引用 指针也是如此。一些编译器将 char 的大小归因于 void,但这是您永远不应依赖的扩展。增加指向 void 的指针是错误的,无法正常工作。

  2. 您拥有的是一个char 数组。通过不同类型的指针访问此数组违反了严格的别名,您不允许这样做。

    这实际上不是您当前代码所做的 -- 查看这一行:

    uint32_t value2 = (int)*pointer; //should be 1802135552

    您只是将单字节(假设您的指针指向char,请参阅我的第一点)转换为uint32_t。你可能的意思

    uint32_t value2 = *(uint32_t *)pointer; //should be 1802135552

    哪些可能做您期望的,但在技术上是未定义的行为。

第二点的相关引用是例如在 N1570 的 §6.5 p7 中,C11 的最新草案:

An object shall have its stored value accessed only by an lvalue expression that has one of the following types:
— a type compatible with the effective type of the object,
— a qualified version of a type compatible with the effective type of the object,
— a type that is the signed or unsigned type corresponding to the effective type of the object,
— a type that is the signed or unsigned type corresponding to a qualified version of the effective type of the object,
— an aggregate or union type that includes one of the aforementioned types among its members (including, recursively, a member of a subaggregate or contained union), or
— a character type.

这个非常严格的规则的原因是例如它使编译器能够基于两个不同类型的指针(char * 除外)可以进行优化的假设从不别名。其他原因包括某些平台上的对齐限制

关于c - 通过指针递增读取作为 void* 传递的 char 数组,然后读取为 char 和其他数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45836300/

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