2013-05-31 1 views
0

Хорошо, в настоящее время я пишу ядро ​​ради своего резюме. Во время написания моего модуля управления памятью я ударил кирпичную стену.Указатели символов и касты из целых чисел (адрес памяти)

int address = (int)malloc(sizeof(Test)) 
consoleWriteString("Variable Address:\n"); 
consoleWriteInteger(address); 

char* f = (void*)address; 

consoleWriteString("\nVariable Address:\n"); 
consoleWriteInteger((int)&f); // Should print off the same as above 

Логически выход должен быть одинаковым для обоих. Где-то что-то пошло не так. поскольку мой вывод следующий.

Variable Address: 47167 
Variable Address: 1065908 

После длительного периода тестирования и отладки я, наконец, сдался и решил спросить переполнение стека. Также, если вы заметите любые ошибки синтаксиса, игнорируйте их. Кстати, все это на C, и все функции являются обычными, в том числе malloc, но я решил, что ошибка не лежит в этом функционале или в любом другом факте. Я считаю, что это только я, будучи глупым в отношении указателей и кастингов, но не смейся над мной, когда это было нечто сверх простое, что я пропустил.

Благодаря Yall

+1

Назначение указателей на целые числа и блокирование вашего кричащего компилятора с помощью приводов? Это путь к катастрофе. Почему бы не использовать 'void * address' или' char * address'? Если причина в том, что нет 'consoleWritePointer', то напишите один! – Jens

+0

Спасибо за информацию, за консольWritePointer, как я могу ее написать? Просто преобразуйте его в адрес в шестнадцатеричном формате и затем распечатайте оттуда? – robbert229

+1

Если у вас уже есть стандартный printf, соответствующий стандарту C, используйте указатель '% p' для указателей; если нет, введите значение указателя в значение без знака и распечатайте его (или используйте объединение, вставьте в ptr и прочитайте значение без знака). – Jens

ответ

2

&f - адрес f, а не адрес, содержащийся в нем! f находится в стеке. Его значение (адрес, который вы впервые напечатали) указывает на выделенную память.

Подумайте об этом так: вы выделяете место в памяти для некоторых вещей. Эта область памяти имеет адрес. Вы помещаете адрес в указатель (f), так что он указывает на того региона. Но f сам должен быть где-то в памяти, чтобы сохранить значение этого адреса. В этом случае f находится в стеке, а &f получает адрес f (контейнер с исходным адресом), а не адрес, который содержит f.

Как в стороне, быть очень осторожным литейные обращается к int (и обратно!), Так как int не может быть достаточно большим, чтобы содержать адрес (например, на x86-64, в зависимости от компилятора). Я считаю, что правильный тип для использования, когда вы хотите использовать адрес в качестве целого, равен uintptr_t в stdint.h.

+0

Хороший совет относительно размера адреса и размера 'int'! – Floris

+0

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

+0

@robbert: Без проблем :-) – Cameron

1

значение Р (что случается быть указателем) такая же, как address (который также является указателем, но другого типа) - это то, что вы делаете в линия

char* f = (void*)address; 

Но вы печатаете адрес Р:

consoleWriteInteger((int)&f); 

И это не то же самое, что значение Р ... изменить эту строку

consoleWriteInteger((int)f); 

и вы должны быть все готово.

0

первая распечатка - это int, хотя malloc возвращает адрес, второй - адрес, переданный в int. do f вместо & получает ваш адрес значения в то время как * разыгрывает указатель, получая значение того, на что указывает.

+0

почему downvote this – aaronman

+0

OP не запрашивает значение того, на что указывает, но адрес. Таким образом, «use' * f' »- неправильный совет. «Использовать' f', а не '& f' - это правильный совет, как объяснялось в двух других ответах. – Floris

+0

@Floris я изменил его, но я не уверен, почему это имеет значение, поскольку все об OP неверно, если он не понимает, как malloc работает не уверен, почему он пишет ядро ​​ – aaronman

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