Вопрос

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

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

// редактировать: объявленное пространство для 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);

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

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

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

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

Это было полезно?

Решение

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

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 -> новый
  • printf -> cout или (лучше) Boost :: Format

Ответьте на ваше редактирование

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

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

Другие советы

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

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

Человек, кто -то любит единорогов ... :)

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

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

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

Если Testint - это просто «int», может ли это быть, так как вы передаете его по цене, и он не изменится?

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top