MEMSET & MEMCOPY
-
23-09-2019 - |
Вопрос
Я пишу распределитель памяти, и мне нужен способ хранить целое число внутри памяти. Это целое число будет представлять размер блока, поэтому я могу перейти к концу, учитывая указатель на начало.
Вот мой тестовый пример:
// редактировать: объявленное пространство для 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
Перед его использованием.