是否可以通过引用第n + 1个元素来找到数组末尾的地址?

不得

我需要知道指针何时经过整个数组->在它后面的第一个位置。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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

是否可以通过指定索引数组来访问数组的第 n 个深度元素?

通过在前一个数组的末尾存储下一个元素来扩展数组

通过从n个数组中选择最多1个元素来查找n个数组中的m个元素

通过在下一个块中仅添加1个元素来在javascript中分块数组

是否可以在Haskell中部分应用第n个参数?

需要通过查找数组中是否存在 2 个元素来获得布尔结果

sed:是否可以选择替换每行匹配的第 N 个和第 M 个匹配项?

如何通过从头到尾移动N个元素来旋转数组?

在引用传递不起作用时通过传递链表在第n个位置添加元素

通过函数无法显示数组的第n个元素

是否可以选择第n个孩子的最后n个项目?

通过抽取或提取Swift中的第n个元素来进行下采样收集的有效方法

是否可以通过将每个字符计为 1 来找到文本文件中字母的坐标?

在不使用JavaScript的情况下使用第n个孩子时是否可以访问n?

如何通过在第一个位置插入元素来更新数组

是否可以通过引用将numpy数组传递给cpdef函数?

通过对重叠间隔求和来找到最大元素

是否可以通过for循环中的一个方法调用来引用不同的方法?

是否可以使用 Cypress 获取第 n 个孩子的内容?

标识矩阵的第n个插入元素,该元素通过插入交替的上三角元素和下三角元素来填充

通过从每个列表中选择1个元素来创建列表(序言)

当其他所有元素都起作用时,JavaScript无法通过页面上的ID来找到一个特定元素

是否可以找到View Model引用的属性

有没有办法通过将多维 numpy 数组与另一个 numpy 数组匹配来找到它的索引?

是否可以引用DITA <topichead>元素?

HTML DOM元素是否通过引用存储在Javascript数组中?

通过CSS为第n个元素上色

如何通过纯 JavaScript 定义第 n 个父元素?

如何找到n维numpy数组的第i个最大元素的索引?