2017-12-20 36 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;'또는'unsigned long int iter = sizeof (char) 'unsigned long int iter = sizeof iter/sizeof * cp;' – chux

답변

1

문제는 당신이하지 sign extending 값을 걸 수 있습니다. -1int 값을 설정

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.

은 그 바이트 모든 수정 요구한다.

하지만 그래서 당신은,이 구현 정의 행동에 의존하는이 코드가 아닌 휴대용 만드는 것 할 점에 유의 :