【问题标题】:Changing value of an int array with a signed char pointer使用带符号的 char 指针更改 int 数组的值
【发布时间】:2018-06-02 23:43:29
【问题描述】:

我想创建一个函数来将 void 数组索引的值更改为指定值。

我正在使用一个简单的函数进行测试,该函数使用数组中的 char 副本(char 为 1 个字节)更改特定索引的值。我使用 char 是因为我可以将一个添加到 copy 以指向下一个索引并更改值。

函数是:

void
change_value(int ** ptrs, int pos, int val) {
  char * cp = *ptrs;
  /* Assign a copy of the array */
  unsigned long int iter = sizeof(int) / sizeof(char);
  /* Store the size for every index of the array */

  for (int i = 0; i < pos; i++)
    for (unsigned long int e = 0; e < iter; e++)
      cp++;
  /* Advance to the position */

  *cp = (signed char)val;
  /* Assign the value */
}

当我尝试将值更改为 -1 时,问题就出现了。我认为问题在于将 char 分配给 int 时,-1 被转换为 255,所以我在分配中添加了转换为 signed char。但还是没有结果。

主要功能是:

  arr[0] = 1;
  arr[1] = 2;
  arr[2] = 3;
  arr[3] = 4;
  arr[4] = 5;
  /* Create an array for values */

  change_value(&arr, 1, 0);
  /* Change value */
  for (int i = 0; i < 5; i++)
    printf("arr[%d] : %d\n", i, arr[i]);
  /* Show the array */

  printf("\n");

  change_value(&arr, 2, -1);
  /* Change value */
  for (int i = 0; i < 5; i++)
    printf("arr[%d] : %d\n", i, arr[i]);
  /* Show the array */

输出:

arr[0] : 1
arr[1] : 0
arr[2] : 3
arr[3] : 4
arr[4] : 5

arr[0] : 1
arr[1] : 0
arr[2] : 255
arr[3] : 4
arr[4] : 5

【问题讨论】:

  • sizeof(int) / sizeof(char)? sizeof (char) 总是 1....
  • 而不是unsigned long int iter = sizeof(int) / sizeof(char);,我希望unsigned long int iter = sizeof iter;或者unsigned long int iter = sizeof iter/sizeof *cp;

标签: c arrays char int signed


【解决方案1】:

问题是你不是sign extending这个值。

int x = 0;
*((signed char *)&x) = (signed char)-1;

printf("%08x\n", -1);       // FFFFFFFF
printf("%08x\n", 255);      // 000000FF
printf("%08x\n", x);        // 000000FF

Live demo.

换句话说,将int 的值设置为-1 需要修改其所有字节。

但请注意,要这样做,您将依赖两个实现定义的行为,从而使此代码不可移植:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-20
    • 2014-06-28
    • 2023-04-04
    • 2017-09-03
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多