Member 13906640 Ответов: 1

Как удалить адрес указателя в C++


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

но в моем скрипте eror при удалении (coba);

пример :
Ввод :
2 3
2 5
2 6
1 2
3
1 2
Выход :
Значение =5;
(5 Удаление)
Значение =6;

Су (*Коба).Нилай = 3 , 6..
5 - это удаление..
но я не понимаю, как это сделать..
helpp

Что я уже пробовал:

#include <iostream>
#include <vector>
 
using namespace std;
 
struct test
{
  int next;
  int previous;
  int value = 0;
};

int main()
{
	test *coba, testt;
	coba = &testt;
	int z;
	int l = 0;
	int perintah;
	int y = 0;
	while(true)
	{
		cout << "Input : ";
		cin >> l;
		if(l == 2)
		{
			cin >> (*coba).value;
			*(++coba);
			y++;
		}
		if(l == 1)
		{
			cin >> z;
			for(int i = 0; i < y-z+1; i++)
			{
				(--coba);
			}
			cout << "Value = " << (*coba).value << endl;
			cout << "1.next / 2.previous / 3.erase : ";
			cin >> perintah;
			if(perintah == 1)
			{
				(++coba);
				testt.next = (*coba).value;
				cout << "Next = " << testt.next << endl;
				for(int i = 0; i < y-z; i++)
				{
					(++coba);
				}
			}
			else if(perintah == 2)
			{
				(--coba);
				testt.previous = (*coba).value;
				cout << testt.previous;
				for(int i = 0; i < y-z+2; i++)
				{
					(++coba);
				}
			}
			else if(perintah == 3)
			{
				delete (&coba);
			}
		}
	}
  return 0;
}

KarstenK

Обычно на C++ пишется такой стиль: coba->value.

Используйте delete только для указателей, значения которых относятся к памяти (или объектам/структурам), которые выделяются с помощью new. (Это фундаментальное правило!!!)

CPallini

Что ты пытаешься сделать? Вы подразумеваете связанный список? Почему бы вам не рассмотреть возможность использования std::list вместо этого?

1 Ответов

Рейтинг:
0

OriginalGriff

Как я уже говорил вам вчера: Ошибка структуры C++ с указателем[^- ЭТО НЕ УКАЗАТЕЛИ.

struct test
{
  int next;
  int previous;
  int value = 0;
};
next и previous не может быть объявлено как int - они должны быть значениями указателей и предпочтительно указателями на фактический тип назначения:
struct test
{
  struct test *next;
  struct test *previous;
  int value = 0;
};
Если вы этого не сделаете, то у вас возникнут проблемы. Целые числа-это 32-битные значения (в современном компиляторе), но в 64-битной системе указатели-это 64-битные значения: поэтому, когда вы устанавливаете указатель на адрес, вам нужно место назначения, которое имеет достаточно места для хранения всего 64-битного значения, если у вас его нет, то что-то будет перезаписано...

Чтобы добавить к этому, ваш "следующий" код-это полный мусор!
test *coba, testt;
	coba = &testt;
...
	(++coba);
	testt.next = (*coba).value;
Нет, вы не можете просто сделать это - вы используете память, которую вы не выделили, но вы используете++, поэтому вы снова начнете разрушать память. А последняя строчка? Какого черта ты ожидаешь от этого?

Хватит гадать. Прочтите свои заметки по курсу и начните думать. Надежда и молитва - это не жизнеспособная стратегия проектирования...


Member 13906640

Я только вчера выучил указатель, и я могу научиться видеть только из интернета, это очень трудно для меня

Member 13906640

Мне сказали сделать это только со структурой и указателем, я старался изо всех сил, но это очень трудно :(

Member 13906640

Я думаю добавить его следующее значение на:
*(++coba);
это неправильно?

OriginalGriff

Да.
Потому что Коба указывает на память, в которой есть место только для одного экземпляра структуры.

Серьезно: если вы пытаетесь научиться этому материалу "видеть из интернета", то вы никогда ничего не добьетесь: идите на курс; возьмите книгу (ваша местная библиотека может быть в состоянии найти вам что - то) - вам нужно, чтобы этот материал объяснялся вам структурированным способом, а не случайным образом, представленным кодом, который вы явно еще не понимаете.

И мы не можем научить вас: это маленькое крошечное текстовое поле, а не книга или класс! :смеяться: