C 空洞的大小

C 空洞的大小,c,pointers,C,Pointers,如果我想对指向一个字节的指针进行操作,我应该使用void*还是char*,因为我听说了 sizeof(char) 不总是1字节,那么void*呢?如果我这样做 void *p ++p 它会指向任何地方一个字节吗?在C中,指针算法不是为空指针定义的。指针算法本质上与指针类型的大小有关。对于void*而言,指向类型的大小未知 要查看指针算法如何适用于不同对象,请尝试以下操作: int obj[5]; int *ip = obj; char *cp = (char *)obj; ip++; cp

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

sizeof(char)
不总是1字节,那么void*呢?如果我这样做

void *p
++p

它会指向任何地方一个字节吗?

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

要查看指针算法如何适用于不同对象,请尝试以下操作:

int obj[5];
int *ip = obj;
char *cp = (char *)obj;

ip++;
cp++;

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

但是,如果编译器确实支持它,则void指针上的指针算法与char指针上的指针算法的工作原理相同。

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

要查看指针算法如何适用于不同对象,请尝试以下操作:

int obj[5];
int *ip = obj;
char *cp = (char *)obj;

ip++;
cp++;

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

但是,如果编译器确实支持它,则void指针上的指针算法与char指针上的指针算法的工作原理相同。

为此,我认为您应该使用
。它定义了以下类型(除其他类型外):

如果您知道自己在做什么,并且想在内存中使用指针算法,那么就使用
uint8\u t*
指针。(是的,我只是把它当作动词,顺便说一句。)

例如:

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
}
uint8_t*p=;
而(*p)//p指向非空字节
{
*p^=0xA5;//将字节与A5异或
p++;//递增到下一个字节。
*(uint32_t*)p=0xDEADBEEF;//写入32位(DWORD)
((uint32_t*)p)++;//将p增加4个字节
}

为此,我认为您应该使用
。它定义了以下类型(除其他类型外):

如果您知道自己在做什么,并且想在内存中使用指针算法,那么就使用
uint8\u t*
指针。(是的,我只是把它当作动词,顺便说一句。)

例如:

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
}
uint8_t*p=;
而(*p)//p指向非空字节
{
*p^=0xA5;//将字节与A5异或
p++;//递增到下一个字节。
*(uint32_t*)p=0xDEADBEEF;//写入32位(DWORD)
((uint32_t*)p)++;//将p增加4个字节
}

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

如果您确实想要获取对象表示的位,请使用
unsigned char
,因为
char
可能是有符号的,并且未指定为无填充

现在,评论一下:

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


特定大小的固定宽度整数类型不需要存在:特别是,如果
CHAR\u BIT
不是2的幂(是的,这样的架构存在),根据定义,
uint8\u t
uint16\u t
uint32\u t
uint64\u t
都不可能存在,
char
占用一个字节的存储空间,因此如果您想根据字节大小进行地址计算,请使用
char*
。而C标准要求
void*
具有相同的存储空间表示为
char*
void*
不包含大小信息,因此不能用于指针算术

如果您确实想要获取对象表示的位,请使用
unsigned char
,因为
char
可能是有符号的,并且未指定为无填充

现在,评论一下:

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


特定大小的固定宽度整数类型不需要存在:特别是,如果
CHAR\u BIT
不是2的幂(是的,这样的架构存在),没有一种类型可以存在,
uint8\u t
uint16\u t
uint32\u t
uint64\u t
,这是有趣的事情,在GCC中定义了它,但我读到它只是一些GCC扩展,那么sizeof(char)呢,它总是1字节吗?我只需要让指针在递增后再增加1字节,并且这种行为可能与平台无关。@Andna是的,
sizeof(char)
按定义是1。@Andna:没有任何类型的大小是这样定义的(例外情况为
char
,定义为
1
,C99-6.5.3.4)。一般来说,您不应该假设类型的大小是特定的&这就是
sizeof
存在的目的&您应该使用它。有一个很好的定义,如果您有一个特定类型的数组和指向它的指针,那么增加指针将使它指向数组中的下一个元素。当然,它不适用到
void
指针。这是有趣的事情,在GCC中定义了它,但我读到它只是一些GCC扩展,那么sizeof(char)呢,它总是1字节吗?我只需要让指针在递增后再增加1字节,可能是这样的