2016-03-06 2 views
1

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

Может кто-нибудь объяснить мне, почему это не работает? У меня нет ошибок сегментации. Он компилирует, я просто ничего не получаю.

#include <iostream> 
#include <cstdlib> 
#include <cstring> 
int main(){ 
    void *buffer = new char[8]; 
    memset((char*)&buffer, 'a', sizeof(buffer)); 
    std::cout << (char*)buffer <<std::endl; 
    return 0; 
} 
+0

Вам не повезло. Я получил [Segmentation Fault] (http://melpon.org/wandbox/permlink/TTXCDsmsZoTf5mDv). – MikeCAT

+1

Попробуйте удалить & из буфера. Это уже указатель. Вы принимаете ** адрес ** указателя. – BryanT

+0

Странно, интересно, связано ли это с тем, как оптимизирован мой компилятор. – mreff555

ответ

3

Я вижу следующие проблемы.

Задача 1

memset((char*)&buffer, 'a', sizeof(buffer)); 

Это неверный адрес, чтобы перейти на memset. Вы должны использовать:

memset(buffer, 'a', sizeof(buffer)); 

Задача 2

sizeof(buffer) вычисляет размер указателя (4 для 32-битных платформ и 8 для 64-битных платформ). Вам нужно использовать длину массива, которая равна 8.

memset(buffer, 'a', 8); 

Задача 3

std::cout << (char*)buffer <<std::endl; 

будет работать только если buffer является нулем строка. Если вы используете memset, вся действительная память установлена ​​на a. Следовательно, строка не имеет нулевой конец.

Вы должны убедиться, что buffer имеет значение null.

buffer[7] = '\0'; 
std::cout << buffer <<std::endl; // No need for explicit cast 
+0

Спасибо R Sahu. Что касается вопроса «Проблема 3», я фактически пытался предотвратить нулевую завершенную строку. Однако я не знал, что cout не будет работать в этих условиях. Есть ли способ печатать информацию о типе, которая не завершена нулем, если я знаю, насколько она велика? – mreff555

0
  1. Вы копируете в адрес buffer. Но buffer хранит адрес буфера. Таким образом, вы копируете адрес адреса.

  2. Оператор << на char * работает только для строк в стиле C. Вы не можете использовать его на произвольных массивах символов, которые не являются строками. Как он узнает, сколько символов выводится?

  3. Оператор sizeof сообщает только размер вашего типа.

-1

Визуальные указатели довольно сложны и обычно не используются. Я бы просто сделал его указателем char * и не использовал ссылку на буфер. Имя указателя - это ссылка на всю ячейку памяти.

Вот хорошая ссылка для функции MemSet: http://www.cplusplus.com/reference/cstring/memset/

удачи. Похоже, у вас он работает в основном.

+0

Вы имели в виду void pointer, а не Null pointer? В любом случае их использование распространено в правильном контексте. – BryanT

+0

Я сделал, кричит. Я отредактирую это. Нулевые указатели на мозг. Спасибо Брайан. – StevenJS88

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