2012-03-01 2 views
-2

Я хочу использовать malloc()/new для выделения памяти 256 Кбайт переменной m. Затем используйте m для хранения данных, таких как строки и цифры. Моя проблема заключается в том, как сохранять данные в m и извлекать их.Фрагментация памяти в C++

Например, как хранить int 123456 в смещениях от 0 до 3 и читать их переменной x? Или сохраните строку «Давид» со смещения 4 до 8 (или 9 с помощью \ 0), а затем верните ее в переменную s?

+1

Но вы достаточно профессиональны, чтобы проверить арифметику указателей, прежде чем задавать такие вопросы? Что вы пробовали? –

+2

Вы помечены тегом C++, но вы спрашиваете о C. EDIT: также это не касается непосредственно фрагментации, хотя я подозреваю, что это подзадача переопределения malloc (интересное упражнение, я буду признавать). Тем не менее, этот тег не имеет отношения к заданному вами вопросу. – jpm

+0

Я бы очень рекомендовал прочитать «Язык программирования C», если вы хотите изучить C или «Ускоренный C++», если вы хотите изучить C++, это довольно неопределенный вопрос, и сначала необходимо изучить ключевые концепции. – 111111

ответ

1

Вы можете сохранить целое число с помощью указателей на литье.

unsigned char *p = new unsigned char[256 * 1000]; 
*(int *) p = 123456; 
int x = *(int *) p; 

Это ужасная идея. Не работайте с нетипизированной памятью и не пытайтесь играть быстро и свободно, как в PHP, потому что C++ менее терпим к неаккуратным программированию.

Предлагаю прочитать вводный учебник на C++, в котором будут объясняться такие вещи, как типы и классы, которые вы можете использовать, чтобы не иметь дело с нетипизированной памятью.

Редактировать: Из комментариев выше, похоже, вы хотите узнать об арифметике указателя.

Не используйте арифметику указателей *.

* если вы не обещаете, что знаете, что делаете.

+0

Этот фрагмент кода может быть поврежден на архитектурах, где недопустимые чтения не допускаются. Пожалуйста, пожалуйста, пожалуйста, не делайте этого. –

+0

@AlexandreC .: Нет, нет архитектуры, где это может произойти сбой. И если бы вы продолжали читать, вы бы заметили, что я говорю ** не делать этого **. (Если бы это был C с 'malloc', я мог бы даже указать на части стандарта, которые гарантируют, что он не потерпит крах, но это C++, поэтому я не уверен, что это указано.) –

+0

«не делай этого» не был адресован вам :) Вы уверены в том, что память будет правильно выровнена для хранения целых чисел? Завтра я буду проверять стандарт C++ (у меня его нет), и у меня нет подсказки о C здесь (но я думаю, это не совсем так). –

0

Прочтите мой комментарий, я думаю, вам нужно знать больше о C и низкоуровневой программе.

Есть ли конкретное приложение для этого формата?

присвоить структуру память вы можете сделать somethinglike

struct my_format{ 
    int first; 
    char second[5]; 
}; 

int main() 
{ 
    struct my_format *mfp= 
      malloc(sizeof(struct my_format)); 
    mfp->first=123456; 
    free(mfp); 
} 

или что-то это не касается особенностей памяти (IE точных позиций Варса) VUR делать так просто плохо почти во всех отношениях.

+0

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

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