2015-11-05 2 views
-1

У нас есть программа, которая выглядит следующим образом:Изменить значение с помощью указателя

int TEST = 7; 
// Put code here 

*((int*) (p + 8)) |= 0x3f; 
// TEST should be now 0x3f 

Вы можете видеть, что переменная р необъявленная. Мой вопрос в том, что переменная p должна быть такой, чтобы TEST был бы 0x3f?

Я уже попытался это:

int *p = &TEST; 

Вы можете изменить значение TEST теперь с указателем р, но это не похоже на работу с *((int*) (p + 8)) |= 0x3f;

+2

что ад '* ((INT *) (р + 8)) | = 0x3f; ' –

+0

@GradyPlayer заявление я думаю? – fuz

+0

пахнет как школьное задание – pm100

ответ

1

Указатель арифметике указателя + целое число может быть только сделано в объекте массива, иначе оно недействительно. Поэтому, чтобы ответить на ваш вопрос, ответ таков: нигде. Вы не можете объявить указатель p со значением, поэтому *((int*) (p + 8)) |= 0x3f; изменяет ваш объект TEST в переносном режиме.

(С99, 6.5.6p8) «Если оба операнда указатель и точка результат к элементам того же объекта массив, или один мимо последнего элемента массива объекта, оценка не должна производить переполнение , в противном случае поведение не определено ».

+0

Где OP говорил, что 'p' должен быть объявлен как указатель? – fuz

+0

@FUZxxl хорошо название * Изменить значение через указатель *, поэтому в моем вопросе рассматривается тот факт, что 'p' не может быть указателем. – ouah

+0

Заголовок вопроса не означает, что 'p' должен быть указателем. Если вы приложите что-то к указателю, вы получите указатель, и с моим ответом значение будет изменено с помощью указателя, даже если 'p' не является указателем. – fuz

0

Одна из возможностей заключается в следующем:

uintptr_t p = (uintptr_t)&TEST - 8; 

Обратите внимание, что p не является указателем здесь, делая p указатель будет опираться на реализацию определенного или неопределенного поведения (в зависимости от того, как вы это делаете) и не жизнеспособный способ получить желаемое поведение.

+0

Могли ли дайверуторы объяснить себя? – fuz

+0

Я думаю, вы имеете в виду И ТЕСТ – pm100

+0

@ pm100 Конечно, исправлена ​​опечатка. – fuz

0

@ kkmah7 - Мне интересно то же, что и Grady Player: «Что именно вы пытаетесь выполнить с помощью *((int*) (p + 8)) |= 0x3f

В частности, мне интересно, «(p + 8)». Вы пытаетесь изменить смещение (изменение где p указывает на) или значение (вы пытаетесь добавить «8» в «TEST»). Если последнее, то «(p + 8») неверно. Если первое, то это undefined behavior.

Этот пример может помочь прояснить:

#include <stdio.h> 

int main(int argc, char *argv[]) { 
    int value = 2; 
    int *p = &value; 

    *p += 2; 
    printf ("value= %d, *p= %d\n", value, *p); 
    /* Output: value= 4, *p= 4 */ 

    *p |= 0x3f; 
    printf ("value= %d, *p= %d\n", value, *p); 
    /* Output: value= 63, *p= 63 */ 

    return 0; 
} 
Смежные вопросы