2015-08-19 2 views
2

У меня возникли серьезные проблемы с моим кодом. Я не понимаю, почему это происходит, и я понятия не имею, как это исправить.Выделение динамической памяти?

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

конструктор класса: (примечание: размер представляет собой целое число, которое определяет, как велико должно быть мой массив указателей, пользователь может определить это)

storeElements = new char*[size]; 

Say размер = 3, теперь storeElements должен быть массивом указателей, способных указывать на 3 отдельные строки символов.

*storeElements = "one"; 
*(storeElements+1) = "two"; 
*(storeElements+2) = "three"; 

Когда я печатаю эти значения сразу после присвоения им, они печатают правильные строки, однако позже в своем коде, в других функциях и после многих других переменных были объявлены, и я открыл текстовый файл вывода , * storeElements вид путается.

Скажем, например, если бы я попытался это сделать (в дальнейшем в моем коде):

cout << *(storeElements+2) << endl; 

Вместо печати «три» он может печатать «один» или вообще ничего.

Там надо быть проблема с динамическим распределением памяти здесь, потому что я читаю из текстовых файлов, а иногда содержимое этого текстового файла сохраняется в элементах * storeElements без меня назначая их * storeElements на всех

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

+1

Если вы находитесь на Linux, valgrind может помочь. Во всяком случае, сваривание вашего кода до минимума, который воспроизводит проблему, дает людям здесь больше шансов помочь. –

+3

Предполагается, что вы читаете из файла, не выделяя достаточно места для хранения каждой строки. Вы пытались использовать 'std :: vector >'? –

+2

Извлеките [MCVE] (http://stackoverflow.com/help/mcve) из своего кода и опубликуйте его. Это безответственно без фактического кода. – Angew

ответ

1

Это просто, вы выделили память для указателей, однако вы не выделили память для массивов символов, на которые указывают указатели.

Эта строка кода совершенна.

storeElements = new char*[size]; 

Теперь, если вы посмотрите на эту строку кода:

*storeElements = "one"; 

Вы не выделили какой-либо памяти для хранения «один». То, что вам нужно, это выделить память, прежде чем назначать значения. Что-то вроде:

*storeElements = new char[strlen("one")+1]; 
strcpy_s(storeElements[0], strlen("one")+1, "one"); 
+3

C-строки не работайте таким образом. Строка '* storeElements =" one ";' устанавливает указатель на местоположение неименованного 'const char [] =" one "', предоставленного компилятором. Его данные остаются доступными до завершения программы, поэтому это не проблема, пока вы не решите изменить строку. Фактически, ваша последняя строка теряет ссылку на пространство, выделенное в строке раньше. – Melebius

+0

В принципе, код работает сначала, так как он указывает на постоянный строковый литерал. чтобы изменить строки, ему нужно выделить пространство для модифицированной строки. –

+0

@ ErikAlapää Да, но в этом случае ему понадобится 'strcpy()' и не простое назначение. – Melebius

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