使用带符号的char指针更改int数组的值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用带符号的char指针更改int数组的值相关的知识,希望对你有一定的参考价值。

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

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

功能是:

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
", i, arr[i]);
  /* Show the array */

  printf("
");

  change_value(&arr, 2, -1);
  /* Change value */
  for (int i = 0; i < 5; i++)
    printf("arr[%d] : %d
", 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
答案

问题是你不是sign extending的价值。

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

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

Live demo.

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

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

以上是关于使用带符号的char指针更改int数组的值的主要内容,如果未能解决你的问题,请参考以下文章

指针和指针变量

C语言 指针数组-字符指针数组&整型指针数组 char*s[3] int*a[5] 数组指针int(*p)[4]

二级指针的应用

不能将int类型的值分配到int类型的实体,是啥意思?例如int *a[10];a[0]=j-i;(i、j均为指针)。

java 中怎么把char型转换成无符号数

C语言中的char具体用法