2017-12-20 42 views
0

void配列インデックスの値を指定された値に変更する関数を作成します。符号付きcharポインタを持つint配列の値を変更する

charコピー(charは1バイト)から特定のインデックスの値を変更する簡単な関数を使ってテストしています。 コピーに次のインデックスをポイントして値を変更できるので、私はcharを使用します。

機能は次のとおりです。私は-1に値を変更しようとすると

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を255に変換すると、の符号付き文字への変換を代入に追加しているため、問題だと思います。しかし、まだ結果はありません。

主な機能は次のとおりです。

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 
+0

'sizeof(int)/ sizeof(char)'? 'sizeof(char)'は常に1 .... –

+0

'unsigned long int iter = sizeof(iter; sizeof(char);)'というよりは、 'unsigned long int iter = sizeof iter/sizeof * cp;' – chux

答えて

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の値を設定すると、そのバイトの全てを修正が必要です。

しかし、あなたは、このコード非ポータブル作り、2実装定義の振る舞いに頼ることだろう行うには次の点に注意してください

関連する問題