C 空洞的大小
如果我想对指向一个字节的指针进行操作,我应该使用void*还是char*,因为我听说了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
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字节,可能是这样的