簡體   English   中英

使用帶符號的char指針更改int數組的值

[英]Changing value of an int array with a signed char pointer

我想創建一個函數,以將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,所以我將分配轉換添加為有符號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

問題是您沒有簽署擴展價值。

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

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

現場演示。

換句話說,將int的值設置為-1需要修改其所有字節。

但是請注意,這樣做將依賴於兩個實現定義的行為,從而使此代碼不可移植:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM