MemSet & MemCopy - PullRequest
       43

MemSet & MemCopy

1 голос
/ 01 апреля 2010

Я пишу распределитель памяти, и мне нужен способ сохранить целое число внутри куска памяти. Это целое число будет представлять размер блока, поэтому я могу перейти к концу, если указатель на начало.

Вот мой тестовый пример:

// РЕДАКТИРОВАТЬ: Заявленное пространство для testInt int * testInt = new int;

head_ptr = (char*) malloc(4*1024*1024); // Allocate 4MB

// EDIT: Should have used std::fill and std::copy
memset(head_ptr,23,sizeof(int)); // Set Address head_ptr = 12345

memcpy(testInt,head_ptr,sizeof(int)); // Set testInt = head_ptr

printf("testInt = %i",testInt);

Это приводит к ошибке сегментации от второй до последней строки.

Имеет ли смысл то, что я пытаюсь сделать?

Если так, каков правильный подход?

Большое спасибо всем за помощь !! Проблема решена: -)

Ответы [ 5 ]

5 голосов
/ 01 апреля 2010

Ответ на оригинальный вопрос

memset(head_ptr,12345,sizeof(int)); // Set Address head_ptr = 12345

Нет, это не так. Это устанавливает первые sizeof(int) байтов от head_ptr до 12345, которые будут переполнены (если вы не используете архитектуру, в которой байт превышает 8 бит).

memcpy(testInt,head_ptr,sizeof(int)); // Set testInt = head_ptr

Что такое testInt? Int *? Int? В последнем случае используйте & testInt.

Также из ваших тегов следует, что вы используете C ++, а не C. Но ваш код на самом деле просто C, вам действительно следует использовать более безопасные функции и возможности C ++:

  • memset -> std :: fill
  • memcpy -> std :: copy
  • malloc -> new
  • printf -> cout или (лучше) Boost :: Format

Ответ на ваше изменение

int* testInt; - указатель на целочисленную переменную, но он не инициализирован: он будет указывать на случайную область памяти (мы можем считать ее «случайной» для всех намерений и целей, даже если это не так).

memcpy затем попытается записать в эту случайную область памяти, к которой, скорее всего, у вас нет доступа, и, следовательно, это приведет к ошибке сегментации (что означает «вы не можете получить доступ к этой области памяти») .

2 голосов
/ 01 апреля 2010

Другие прокомментировали неправильное использование memset(3) и memcpy(3), поэтому я отвечу на вопрос распределителя.

Если вы действительно занимаетесь созданием собственного распределителя памяти в C ++ - взгляните на Главу 4 в Современный дизайн C ++ Александреску. В нем подробно описывается реализация небольшого распределителя объектов. Код доступен как часть библиотеки Loki .

Чувак, кому-то нравятся единороги ...:)

2 голосов
/ 01 апреля 2010

Вы никогда не инициализировали testInt, поэтому ваш вызов memcpy пишет, кто знает, где.

Попробуйте это:

int * testInt = malloc (sizeof (int));

1 голос
/ 01 апреля 2010

Если testInt - просто "int", может ли это быть, поскольку вы передаете его по значению, и оно не изменяется?

1 голос
/ 01 апреля 2010

Не зная, что такое testInt, я не могу быть уверен, но мои умственные способности отладки указывают на то, что вам нужно взять адрес testInt, а не testInt, в качестве аргумента для memcpy.

РЕДАКТИРОВАТЬ: После просмотра того, что вы опубликовали сейчас, вам необходимо выделить память для testInt перед ее использованием.

...