Как разыменовать в зависимости от размера? - PullRequest
2 голосов
/ 15 октября 2010

Я пытаюсь напечатать значение, на которое указывает адрес, но проблема в том, что мне нужно разыменовать этот указатель на основе размера, который передается мне. Так что-то в этом роде:

void print(Address addr, Int size) {
...
}

Я немного запутался в том, как этого добиться. Может ли кто-нибудь указать мне правильное направление?

EDIT: Итак, я думаю:

char p[80];
memset(p, '\0', 80);
memcpy(p, addr, size);

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

Ответы [ 3 ]

3 голосов
/ 15 октября 2010

Ваш вопрос очень неясен. Если вы имеете в виду, что хотите сбросить произвольные двоичные данные с переданного адреса, вам нужно что-то вроде:

void print(const unsigned char *addr, size_t size)
{
    while (size--) printf("%.2x", *addr++);
}

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

void print(const char *addr, int size)
{
    printf("%.*s", size, addr);
}
0 голосов
/ 12 марта 2012

Вы можете использовать оператор switch в подпрограмме:

switch (size) {
   case 1: print( *(char*)pointer); break;
   case 2: print( *(short*)pointer); break;
   case 4: print( *(long *)pointer); break;
   case 8: print( *(__int64*)pointer); break;
   default: puts( "unsupported);
}

(«print» - это подпрограмма для печати целых чисел различных размеров, возможно, с использованием полиморфизма C ++)

Изощренное решениедолжен использовать шаблон C ++, например, используя тип параметра Integer, который заменяется фактическим типом переменной при вызове.Затем эта подпрограмма может воздействовать на размер этой переменной Integer (которая может варьироваться от 1 до 8 или более, если вы сами реализуете более длинные целые числа).Этот недостаток этого подхода заключается в том, что компилятор генерирует стандартный экземпляр для каждого типа аргумента, а логика, зависящая от размера, приведет к «всегда истинным» условиям для некоторых тестов.Самый простой выход - всегда использовать самый длинный тип целого числа, который вы ожидаете.

0 голосов
/ 15 октября 2010

Если это число, которое я предполагаю, вам понадобится что-то вроде этого:

int n=0;
if (size>sizeof(int)) { return; //int is too small };
for (int i=0;i<size;i++) {
  ((char*)(&n))[sizeof(int)-(i+1)] = ((char*)addr)[size-(i+1)];
}
printf("%d",n);
...