发布
社区首页 >问答首页 >空洞的大小

空洞的大小
EN

Stack Overflow用户
提问于 2012-03-24 16:22:57
回答 3查看 2.6K关注 0票数 1

如果我想对指向一个字节的指针进行操作,我应该使用void*或char*,因为我听说

代码语言:javascript
代码运行次数:0
复制
sizeof(char)

并不总是1个字节,那么void*呢?如果我这样做了

代码语言:javascript
代码运行次数:0
复制
void *p
++p

它会再指向每个地方一个字节吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-24 16:24:45

在C中,没有为空指针定义指针算法。指针运算本质上与指向类型的大小有关。对于void *,指向类型的大小是未知的。

要查看不同对象的指针算法是如何工作的,请尝试以下命令:

代码语言:javascript
代码运行次数:0
复制
int obj[5];
int *ip = obj;
char *cp = (char *)obj;

ip++;
cp++;

printf("%p\n%p\n", ip, cp);

但是,如果编译器支持它,则空指针上的指针算术与字符指针上的工作方式相同。

票数 8
EN

Stack Overflow用户

发布于 2012-03-24 16:28:28

为此,我认为您应该使用<stdint.h>。它定义了以下类型(以及其他类型):

代码语言:javascript
代码运行次数:0
复制
uint8_t   Always 1 byte (assuming 8-bit bytes, as is nearly ubiquitous)
uint16_t  Always 2 bytes
uint32_t  Always 4 bytes
uint64_t  Always 8 bytes

如果你知道自己在做什么,并且想要在内存中进行指针运算,那么可以使用uint8_t*指针。(是的,我只是把它当作动词,顺便说一句。)

示例:

代码语言:javascript
代码运行次数:0
复制
uint8_t* p = <Some Base Addr>;
while (*p)   // p points to non-null byte
{
    *p ^= 0xA5;   // XOR the byte with A5
    p++;          // Increment to the next byte.

    *(uint32_t*)p = 0xDEADBEEF;  // Write a 32-bit (DWORD)
    ((uint32_t*)p)++;            // Increment p by 4 bytes
}
票数 1
EN

Stack Overflow用户

发布于 2012-03-24 17:38:16

根据定义,char占用单字节的存储空间,因此,如果您希望根据字节大小进行地址计算,请使用char *。虽然C标准要求void *具有与char *相同的表示形式,但void *没有携带大小信息,因此不能用于指针运算。

如果您实际上想要了解对象表示的细节,请使用unsigned char,因为char可能是有符号的,并且没有指定为无填充。

现在,关于Jonathon's answer的评论

虽然stdint.h的固定宽度整数类型也是无填充的,您可以在特定的体系结构上使用它们(如果您不需要可移植性,那么特定于平台的代码没有什么问题),但通常您只知道它们的位宽,而不知道它们的字节大小,因为CHAR_BIT可以不同于8(对于嵌入式世界的某些部分,16和32是“常见的”)。但是,对于POSIX系统,字节==八位字节是必需的。

不需要存在特定大小的固定宽度整数类型:特别是,如果CHAR_BIT不是2的幂(是的,存在这样的体系结构),则uint8_tuint16_tuint32_tuint64_t类型都不能存在

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9850198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档