我需要知道指针何时经过整个数组->在它后面的第一个位置。c中的示例代码:
unsigned int ar[10];
char *pointer = (char*) ar;
while(pointer != (char*) &ar[10]){
*pointer++ = 0xff
}
此示例是否可以将数组的每个元素设置为0xffffffff?
当使用原始二进制文件时,我建议使用无符号字符类型,例如uint8_t
代替char
,因为后者具有实现定义的签名。
然后,可以使用C中的两个特殊规则:
C11 6.3.2.3/7
当指向对象的指针转换为指向字符类型的指针时,结果指向该对象的最低寻址字节。结果的连续递增(直到对象的大小)会产生指向对象剩余字节的指针。
这使我们可以使用字符指针检查或修改C中任何类型的原始二进制内容。因此,您确实可以使用字符指针将整数数组的每个字节设置为0xFF。
另一个特殊规则隐藏在加法运算符的工作方式之内,因为[]运算符只是+和取消引用周围的语法糖。C11 6.5.6 / 8,重点是:
如果指针操作数和结果都指向同一数组对象的元素,或者指向数组对象的最后一个元素,则求值不应产生溢出;否则,行为是不确定的。
这使我们可以检查int
数组末尾以外的地址1 。
但是,在字符类型的指针和int
指针之间进行转换会产生未对齐的指针,并且(至少在理论上)会导致未定义的行为以及可能的指令陷阱。因此,您不能仅将字符指针转换为整数指针并进行比较。
因此,完全正确的方法是增加字符指针,sizeof(int)
然后在循环中的每圈设置4个字节。
这意味着以下是设置数组中所有字节的明确定义(但麻烦且难以阅读)的方式:
#include <stdio.h>
#include <stdint.h>
int main (void)
{
unsigned int arr[10];
for(uint8_t* i = (uint8_t*)arr; (unsigned int*)i != &arr[10]; i+=sizeof(unsigned int))
{
i[0] = 0xFF;
i[1] = 0xFF;
i[2] = 0xFF;
i[3] = 0xFF;
}
for(size_t i=0; i<10; i++)
{
printf("%X\n", arr[i]);
}
return 0;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句