Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
laconic
0 / 0 / 0
Регистрация: 05.11.2012
Сообщений: 28
1

Двойной указатель - Правильно выполнить присваивание

06.09.2013, 00:44. Просмотров 924. Ответов 10
Метки нет (Все метки)

Ребят, помогите правильно выполнить присваивание
C
1
2
3
4
5
int pop(struct stack **st) {
    struct stack *temp = *st;
    *st = *st->next; //ошибка
    free(temp);
}
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.09.2013, 00:44
Ответы с готовыми решениями:

Для чего нужен двойной указатель?
Нужно качественное объяснение для чего нужен двойной указатель? Где он применяется? И покажите...

Считывание одной строки, не используя в качестве аргумента функции двойной указатель
Язык C начал изучать недавно. Хочу написать функцию считывания строки без ограничения на её длину....

указатель на указатель или присваивание объекта
Доброе утро. Вот я в своем классе создал параметр class TTo4ka { ... TGrup **MyGrup; ... };

Двойной указатель
Это не совсем C++ вроде, а просто C, но поясните, пожалуйста, зачем в коде в строчку **sums=NULL...

Двойной указатель
for (i=0; i<N; i++) delete A; //Освобождение памяти для A delete A; Вопрос по...

10
GoldenChild
29 / 29 / 18
Регистрация: 12.06.2013
Сообщений: 65
06.09.2013, 00:49 2
C++
1
*st = (*st)->next
1
palva
3228 / 2329 / 482
Регистрация: 08.06.2007
Сообщений: 8,397
Записей в блоге: 4
06.09.2013, 00:53 3
free делать на локальную переменную недопустимо.
0
laconic
0 / 0 / 0
Регистрация: 05.11.2012
Сообщений: 28
06.09.2013, 03:14  [ТС] 4
Цитата Сообщение от palva Посмотреть сообщение
free делать на локальную переменную недопустимо.
Можете, пожалуйста, объяснить почему? И как будет правильно?
0
06.09.2013, 03:14
Nameless One
Эксперт С++
5795 / 3444 / 356
Регистрация: 08.02.2010
Сообщений: 7,448
06.09.2013, 05:39 5
palva, чушь.
0
palva
3228 / 2329 / 482
Регистрация: 08.06.2007
Сообщений: 8,397
Записей в блоге: 4
06.09.2013, 10:40 6
Переменная temp располагается в стеке при входе в функцию. При выходе из функции память стека освобождается автоматически. free можно делать только на переменные, которые были получены при помощи функции malloc. Правильно будет строчку 4 вообще убрать. Иначе вы рискуете вылетом программы.
Цитата Сообщение от Nameless One Посмотреть сообщение
palva, чушь.
Со мной это бывает.
0
RyukChris
1 / 1 / 2
Регистрация: 03.04.2013
Сообщений: 9
06.09.2013, 10:52 7
Я вообще не понимаю, зачем делать указатель на стэк?!

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
template <class T> class Stack
{
T *m;
int size; //размер стека
int count; //текущее количество данных в стеке
 
public:
 
//КК по умолчнию
Stack(void)
{
size = 10; 
count = 0;
m = new T [size];
}
//КК с указанием размера стека
Stack(int _size)
{
size = _size; 
count = 0;
m = new T [size];
}
 
~Stack(void)
{
delete [] m;
}
 
Stack & operator = (const Stack & ob) {
delete [] m;
size = ob.size;
count = ob.count;
m = new T [ob.size];
for (int i = 0 ; i < count; i++ )
m[i] = ob.m[i];
return * this;
}
//КК
Stack (const Stack & ob) {
size = ob.size;
count = ob.count;
m = new T [size];
for (int i = 0 ; i < count; i++ )
m[i] = ob.m[i];
}
 
int GetCount() {
return count; 
}
 
void Push (T Elem){
if (Elem < m[count - 1]) {
if(count == size) {
size *= 2;
T * temp = new T [size];
for(int i = 0; i < count; i ++)
temp[i] = m[i];
delete [] m; 
m = temp;
}
m[count] = Elem;
count ++;
}
else throw Exception ("Такой элемент нельзя добавить в текущий стек");
}
 
T Pop () {
if (!count) throw Exception ("Стек пуст"); 
count —;
return m[count];
}
 
T Peep () {
if (!count) throw Exception ("Стек пуст"); 
return m[count - 1];
}
 
bool Contains (T Elem) {
for (int i = 0; i < count; i++)
if (m[i] == Elem) return true; 
return false;
}
};

Прошу извинить, за С++ код)
Вот тебе пример, работы со стеком
0
palva
3228 / 2329 / 482
Регистрация: 08.06.2007
Сообщений: 8,397
Записей в блоге: 4
06.09.2013, 10:54 8
laconic, Кроме того, функция pop обязана вернуть целое значение, а оператора return у вас нет.

Добавлено через 1 минуту
RyukChris, форум касается чистого си.
0
RyukChris
1 / 1 / 2
Регистрация: 03.04.2013
Сообщений: 9
06.09.2013, 10:59 9
Я знаю, но у меня пример есть только на С++, что мешает его перелопатить?
0
Nameless One
Эксперт С++
5795 / 3444 / 356
Регистрация: 08.02.2010
Сообщений: 7,448
06.09.2013, 11:01 10
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Цитата Сообщение от palva Посмотреть сообщение
Переменная temp располагается в стеке при входе в функцию. При выходе из функции память стека освобождается автоматически. free можно делать только на переменные, которые были получены при помощи функции malloc. Правильно будет строчку 4 вообще убрать. Иначе вы рискуете вылетом программы.
Только надо понимать, что освобождается память не для локальной переменной temp, а для указателя (адреса), который она хранит. Этот адрес получен извне функции (формальный параметр st), причём, я полагаю, использовалась функция malloc. Так что ничего убирать не надо, а то получится утечка памяти.

Вот упрощенный пример, чтобы понять, как это всё работает:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <stdlib.h>
 
struct stack
{
    struct stack *next;
};
 
void pop(struct stack **top)
{
    struct stack *temp = *top;
    printf("pop from the top: %p\n", temp);
    *top = (*top)->next;
    free(temp);
}
 
int main(void)
{
    struct stack *top = malloc(sizeof *top);
    top->next = NULL;
    printf("top of the stack: %p\n", top);
    pop(&top);
    exit(0);
}
По выводу программы явно видно, какая именно память освобождается.

Добавлено через 40 секунд
Цитата Сообщение от RyukChris Посмотреть сообщение
Я знаю, но у меня пример есть только на С++, что мешает его перелопатить?
Ну так перелопать. Как закончишь, сам сможешь ответить на свой вопрос.
0
palva
3228 / 2329 / 482
Регистрация: 08.06.2007
Сообщений: 8,397
Записей в блоге: 4
06.09.2013, 11:02 11
Цитата Сообщение от Nameless One Посмотреть сообщение
Только надо понимать, что освобождается память не для локальной переменной temp, а для указателя (адреса), который она хранит.
Да, вы правы, а я не прав.

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
06.09.2013, 11:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.09.2013, 11:02

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

Как правильно удалять выделенную память под указатель на указатель?
есть код #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; using...

В массиве из 20 чисел выполнить обратное присваивание
В массиве из 20 чисел выполнить обратное присваивание (первый элемент становится равным последнему,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru