2013-05-22 3 views
3

У меня есть программа, в которой мне нужно работать с указательными массивами. Моя проблема в том, что я не знаю, как удалить элемент i из указателя p (p [i]). Я подробно расскажу о проблеме ниже.Удалить элементы из массива указателей

Я имею структуру:

struct CuttingLine 
    { 
     NxU32 linePoints[150]; 
     NxU32 lineLength; 
     NxVec3 normal; 
    }; 

Тогда я объявляю указатель:

CuttingLine* cuttingLines; 

Я инициализировать указатель, как это:

cuttingLines = (CuttingLine*)malloc(sizeof(CuttingLine) * 10); 

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

for(int i=0;i<3;i++) 
    cuttingLines[i] = line; 

Затем я хочу снова пройти через указатель, и удалить три элемента, но не освобождает указатель (Я понимаю, что вы можете удалить указатель по телефону бесплатно (cuttingLines)). Как я могу это сделать? Я просто хочу удалить элементы внутри него, но не освобождать память, выделенную в начале.

+0

Удалить или стереть? Что вы хотите, чтобы память содержала после операции? – Beta

+0

Это было бы очень утомительно. Для сложных манипуляций списками используйте вектор. – ApproachingDarknessFish

+0

Чтобы * удалить * элемент (или установить его пустым, насколько я понимаю ваш вопрос), вам придется «memset (cutLines [i], 0, sizeof (CuttingLine))». Это не освобождает память, но устанавливает ее в «NULL». – rath

ответ

1

Потому что cuttingLines является указателем на CuttingLine, ваш цикл фактически выполняет структурную копию line в каждом из трех позиций. Нет необходимости в удалить эти глубокие копии. Вам просто не нужно больше использовать эту информацию, когда вы закончите с ней, и обратите внимание, что переменная cuttingLines содержит неиспользуемые данные. Затем вы можете повторно использовать переменную cuttingLines (заполняя ее новыми строками) в удобное для вас время.

+0

Так что я могу переписать над ними без проблем? – user2399378

+0

@ user2399378: Это правильно в этом случае, так как ваша структура 'CuttingLine' не содержит указателей на динамически выделенную память. – jxh

+0

@ user2399378: Еще одно предостережение, вы можете переписать их без каких-либо проблем, пока память действительно больше не используется кем-либо. Когда вы спросили, как удалить элементы без освобождения памяти, я предположил, что это означает, что эти строки больше не нужны никому. – jxh

1

Для меня похоже, что вы хотите иметь массив указателей и динамически выделять элементы массива. В этом случае вы должны установить значение указателя равным NULL, что означает, что указатель не указывает на что-либо. Например:

cuttingLines[i] = NULL; 

Это означает, что «у меня есть указатель в моем массиве, но он не указывает ни на что».

Однако, если вы не освободите память (вызывая free(cuttingLines[i])), у вас будет утечка памяти, поэтому не забудьте освободить память позже в вашей программе. Для этого вам понадобится другой указатель где-нибудь, указывающий на то, что каждый вызов возвращается malloc.

Просто для того, чтобы быть педантичным: вы не можете освобождать указатель (кроме как в смысле выделения, например, sizeof(CuttingLine*) с использованием malloc); вы можете освободить память, поэтому вызов free(ptr) освобождает память, на которую указывает указатель. Кроме того, вы относитесь к cuttingLines как массив указателей, то есть указатель указателей, поэтому его тип должен быть CuttingLine** и вы бы объявить и выделить его:

CuttlingLine** cuttingLines; 
cuttingLines = (CuttingLine**)malloc(sizeof(CuttingLine*) * 10); 

Кроме того, вы не должны отбрасывать возвращаемое значение malloc (см. here), если вы не пишете C++, и в этом случае вам не нужно будет использовать указатели для указателей в первую очередь.


Если с другой стороны, вы хотите иметь массив CuttingLines, то вы на правильном пути, в том смысле, что вы выделяете cuttingLines правильно, и вам не нужно, чтобы освободить память, используемую индивидом CuttingLine. Однако в этом случае вы не знаете, какие элементы в массиве действительны, а какие нет, если вы не отслеживаете индексы кода или сами элементы, например. установите lineLength на 0 и проверьте его значение.

+0

Вы предполагаете, что искатель написал то, что они не собирались писать. Поскольку вопрос в настоящее время написан, ваш ответ не применяется. Нет ничего плохого в создании массива из трех структур, как это сделал ассер. – jxh

+0

Да, вы правы. Я отредактировал ответ. – Antti

+0

Вы правы, вторая ситуация для меня, я сделал именно это, у меня есть переменная, которая отслеживает количество элементов в cutLines. Большое вам спасибо за ваш ответ, я действительно новичок в указателях, а также с C++ по этому вопросу, и я еще не совсем понял их полностью. Я уже решил эту проблему, как я уже сказал, отслеживая количество элементов в cutLines, но для дальнейших операций, которые могут потребовать массивы сложных элементов или даже простых массивов, я думаю, что буду использовать векторы. Они кажутся относительно простыми. – user2399378

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