2015-02-16 2 views
1

EDIT: Я знаю, что второй пример неверен, и я знаю, как сделать все правильно, я хочу знать, откуда взялись неправильные значения и где они указывают, когда ничего нет? как значение a стало значением 2686744Каков источник неправильного значения указателя?

Sry, я не знаю, какой ответ я должен выбрать в лучшем случае, поэтому я дал всем вам преимущество. возможно, один будет выбран позже.

Когда я создаю указатель и попытаться захватить это неправильный путь, как показано ниже:

int b = 5; 
int *a; 
a = &b; 

Как я понял, правильный путь, чтобы захватить значение заостренного переменной а является

printf("value of a is: %d\n", *a); 
printf("storage location of a is: %p\n", *a); 

, то выход будет

value of a is: 5 
storage location of a is: 00000005 

но что выходные точки, когда я пытаюсь это неправильно, как это?

printf("value of a is: %d\n", a); 
printf("storage location of a is: %p\n", a); 

Я получаю выход

value of a is: 2686744 
storage location of a is: 0028FF18 

Где это пришло? есть ли автоматически созданное место хранения для a и откуда появилось его значение?

Надеюсь, вы меня понимаете, мой английский не очень хорош. спасибо

+1

'0028FF18' is' 2686744', но в шестнадцатеричном виде. '% p' используется только для печати указателей. '* a' разделяет указатель и дает значение в памяти, обозначенное' a'. 'a' - это сам указатель, и печать' a' даст вам адрес 'b'. –

+0

но 2686744 не является местом хранения b, а также не значением? – muni

ответ

2

Вы вводите в заблуждение спецификаторы формата.

Когда вы используете %d в printf, параметр, который вы передаете позже, должен быть int. Когда вы используете %p, параметр, который вы передадите ему, должен быть адресом. здесь:

printf("storage location of a is: %p\n", *a); 

%p Вы указываете, но передать целое число к нему (значение объекта, к которому a баллов), который является неправильным и неопределенное поведение.

То же самое здесь:

printf("value of a is: %d\n", a); 
printf("storage location of a is: %p\n", a); 

-первых, это не так. Во-вторых, правильно, но вы должны использовать его следующим образом:

printf("storage location of a is: %p\n", (void*)a); 
+0

Это означает, что 2686744 - это не значение, его местоположение? – muni

+1

@muni: Да, если вы печатаете значение 'a', однако с помощью спецификатора% p вы должны получить адрес объекта, к которому указывает a. Но вы использовали% d для печати значения 'a' в этом примере, что является неопределенным поведением –

+0

, но не получает значение b с помощью' a = & b'? – muni

0
printf("storage location of a is: %p\n", *a); 

Это неправильно, как вы используете неправильный спецификатор формата для распечатки int значения

printf("storage location of a is: %p\n", (void *)a); 

Чтобы получить значение, хранящееся в этом месте имеют

printf("value of a is: %d\n", *a); 

является правильный способ распечатать адрес, в котором хранится значение, или какое значение удерживает указатель.

Откуда это? есть ли автоматически созданное хранилище место для а и откуда пришло значение?

Ничего не произошло из ниоткуда. У вас есть указатель, указывающий на то, что некоторая допустимая ячейка памяти, и вы пытаетесь распечатать адрес, а также значение, хранящееся в нем, и это должно быть сделано, как показано выше.

+0

Это означает, что 2686744 не является значением, его местом хранения? – muni

+0

@muni 0028FF18 - это значение/местоположение указателя, на которое указывает указатель/местоположение указателя, в котором хранится значение 'b = 5'. Да, значение a - это адрес, значение, сохраненное в адресе, задано '* a', которое равно 5 – Gopi

+0

, но 2686744 - это не место, я ошибаюсь? – muni

1

* является разыскивается указатель a.

a = 0x0028FF18  // This is the virtual memory address of the variable b 

printf("value of a is: %d\n", a); // This prints it in decimal 
printf("storage location of a is: %p\n", a); // This prints it in hex 

То, что я считаю, что вы хотите,:

printf("value of a is: %d\n", *a); 
printf("storage location of a is: %p\n", a); 
//          ^
1

Это неправильно:

printf("storage location of a is: %p\n", *a); 

Оно должно быть:

printf("storage location of a is: %p\n", a); 

a является адресом памяти, в то время как *a является косвенность, чтобы получить значение, содержащееся по этому адресу.

Опять здесь:

printf("value of a is: %d\n", a); 

a это адрес не значение - следовательно, его UB использовать формат %d спецификатор.

+0

, но 2686744 - не местоположение, 000005 - это место или нет? – muni

+0

'000005' - это значение в формате'% p'. – Sadique

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