foo* one = malloc(sizeof(foo));
Это выделяет пространство для объекта структуры типа foo
и назначает его адрес one
. На самом деле это лучше записать как:
foo *one = malloc(sizeof *one);`
Не повторяя имя типа, вы избегаете возможных ошибок, если тип указателя когда-либо изменится.
Обратите внимание, что на этом этапе значение one->p
- мусор.
one->p = 0x5;
На самом деле это нарушение ограничения . Фактически, вы должны считать, что это незаконно. one->p
- указатель, а 0x5
- значение типа int
. Неявного преобразования целых чисел в указатели не существует (кроме особого случая константы нулевого указателя, которая здесь не применяется).
Ваш компилятор должен был хотя бы предупредить вас об этом. Фактически, любой соответствующий C компилятор должен выдавать диагностическое сообщение c. (На мой взгляд, прискорбно, что многие компиляторы по умолчанию рассматривают это как предупреждение, а не фатальную ошибку, но на то есть исторические причины).
Вы можете сделать это законным, выполнив приведение:
one->p = (byte_ptr)0x05;
Это будет хранить в объекте указателя one->p
результат преобразования целочисленного значения 5 в значение указателя.
Если вы не выполняете какие-то низкоуровневые встроенные программирование в системе, где вы знаете, что находится по указанному адресу памяти c, это почти наверняка не имеет смысла делать это. 0x05
, даже после преобразования, вряд ли будет действительным значением указателя, и любая попытка его использования может взломать sh вашу программу - если вам повезет. (Если вам не повезло, он будет «работать».)
В конечном итоге я хочу установить сам адрес как 0x5, а не значение по этому адресу.
Если это действительно то, что вы хотите сделать, то one->p = (byte_ptr)0x05;
- это способ сделать это. Почему ты хочешь это сделать? Что находится в ячейке памяти 0x05?
int answer = one->p + one->num;
one->p
- указатель, а one->num
- целое число. Вы можете добавить указатель и целое число, но результатом будет указатель, и вы не сможете присвоить его объекту int
без приведения. А с приведением типов это, скорее всего, не имеет смысла.
Если вы хотите хранить целочисленные значения, сохраняйте их в целочисленных объектах.
(Если вы хотите сохранить 0x05
в объект, на который указывает one->p
, вам сначала нужно настроить, чтобы он указывал на что-то, возможно, с другим вызовом malloc
. Но это не то, о чем вы спрашивали, я не буду говорить об этом. Возможно, это то, о чем вы должны были спрашивать, но я бы предпочел не делать никаких предположений.)
И если мне нужен int answer = 0x9, ...
Тогда можно написать int answer = 0x9;
. Я предполагаю, что это не то, что вы ищете, но я не могу точно сказать, что это такое.
Наконец, чего вы пытаетесь достичь sh? Может быть, у вас проблема XY ?