2015-10-14 2 views
-2

Для кода нижеЗначения * ф печататься в качестве адреса переменной она, указывая на

int main() 
{ 
    int x = 2; 
    int *ip = &x; 
    printf("%d",*ip); // Printing the value of *ip gives 2 
        //Now if the value of ip is incremented 
    ip++; 
    printf("%d",*ip); //Printing the value of *ip gives the incremented memory   
} 

Может кто-то пожалуйста, объясните, как, как значение *ip становится напечатано как инкрементированная ячейка памяти. *ip, являющийся оператором отсрочки, должен вернуть значение по адресу справа?

+2

Включите все предупреждения компилятора и посмотрите, полезно ли это. –

+0

Возможно, вы имели в виду '(* ip) ++'? Я предполагаю, что вы хотите увеличить «x» с помощью указателя, а не увеличивать указатель. –

+3

int * ip = x на самом деле означает, объявляет ip как указатель на int и присваивает значения x (который является как int) для ip (который является указателем на int) –

ответ

2

Этот код может вести себя непредсказуемо, потому что

int *ip = x; 

присваивает значение х, к указателю. В основном это жесткие коды 2 в указатель ip.

Он может быть скомпилирован с предупреждениями. Это может привести к ошибкам памяти во время выполнения.

+0

Привет, я сожалею об этом сбое, я исправил строку it & x not x, не могли бы вы теперь взглянуть на вопрос – Akash

+0

Да, это исправляет первый выпуск. У него все еще есть второй вопрос, как объяснил Даниэль Стивенс. Код увеличивает ip, и теперь он указывает на местоположение в стеке, которое сам код не выделял. Следовательно, он печатает все, что там происходит, что является непредсказуемым поведением. –

5

Я вижу две вещи неправильно с кодом. Один из них:

int *ip = x; 

Это попытка присвоить значение int указателю. Это может быть принудительно с помощью флагов компилятора, но должно дать ошибку. Тем не менее, я подозреваю, что это может быть опечаткой в ​​вашем вопросе, так как разыменование адреса 2 должно почти наверняка сбой, но вы утверждали, что он побежал и произвел результат 2. Я собираюсь предположить, что вы на самом деле:

int *ip = &x; 

Вторая проблема:

ip++; 

Здесь вы увеличивающиеся указатель, а не INT он указывает. Я думаю, что вы хотели (для увеличения от 2 до 3) будет:

(*ip)++; 

То есть, увеличить значение точки указателя на.

Если вы увеличиваете указатель, он теперь укажет на другое место в вашем стеке, которое может быть другой локальной переменной (например, сам указатель) или обратным адресом или указателем фрейма стека или другим скрытым значением , Существует хорошая вероятность, что новое значение будет своего рода указателем, значение которого аналогично адресу вашего указателя или иначе будет выглядеть как вывод печати указателя. Естественно, вы не должны увеличивать указатель, указывающий на один элемент. Это никогда не будет хорошей идеей.

+0

Привет, для первой части мне жаль, что вопрос был ошибочно напечатан, это должно быть & x not x, спасибо за исправление. Для второго, о котором вы упоминали, * ip ++ также возможно как (* ip) ++, вопрос связан с ассоциативностью.Для (* ip) ++ проблем нет, потому что значение, содержащееся в ячейке памяти (как указано ip), увеличивается. Я попытался с помощью * ip ++ увидеть результаты и обнаружил, что на этот раз напечатанное значение - это место с увеличенной памятью, однако в этом месте нет значения. Короче говоря, указатель ip указывал на неинициализированное целочисленное местоположение – Akash

Смежные вопросы