Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
amator_IP
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 5
#1

При передачи указателя на обьект ошибка,а при передаче ссылки на указатель нет. Почему? - C++

27.04.2013, 14:55. Просмотров 443. Ответов 4
Метки нет (Все метки)

Hi All!


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class SomeObj {
public: 
    int x;
}
 
SomeObj* obj = NULL;
 
//1. Первый вариант
 
void someFun(SomeObj* obj) {
     obj = new SomeObj;
     obj->x = 5;
     printf("%d\n", obj->x); //Segmentation fault 
}
 
//2. Второй вариант
 
void someFun2(SomeObj*& obj) {
     obj = new SomeObj;
     obj->x = 5;
     printf("%d\n", obj->x); //All OK!
}
Почему в первом варианте ошибка?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.04.2013, 14:55     При передачи указателя на обьект ошибка,а при передаче ссылки на указатель нет. Почему?
Посмотрите здесь:

При передаче ссылки на указатель программа зависает - C++
Почему это не работает (точнее работает но зависает т.к. в set_val_to23() ссылка на указатель val передаётся со значением 0: main(): ...

Ошибка при передаче в функцию указателя на элемент массива - C++
#include "stdafx.h" #include <iostream> #include <ctime> #include <cstdlib> #include <cmath> const int n = 20; int...

Порча указателя при передаче в функцию - C++
Добрый вечер. Проблема такая - при передаче в функцию структуры, полем которой является указатель на указатель, последний портится....

Использование указателя при передаче параметра - C++
Добрый вечер! Надо оформить функцию "LoadTexture". Вот задачка: IDirect3DTexture9 *tex; LoadTexture(???tex); ... ...

Ошибки преобразования при передаче указателя на функцию - C++
Есть функция SQLITE_API int SQLITE_STDCALL sqlite3_exec( sqlite3*, /* An open database */ const...

При передаче указателя в качестве аргумента функции теряется значение - C++
Добрый день. Есть простенькая задачка сделать связанный список. При этом создается первый эелемнт списка с нулевым указателем на...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 831
27.04.2013, 15:06     При передачи указателя на обьект ошибка,а при передаче ссылки на указатель нет. Почему? #2
В GCC всё ок
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
#include <iostream>
 
using namespace std;
 
class SomeObj
{
public:
    int x;
};
 
//1. Первый вариант
 
void someFun(SomeObj* obj)
{
    obj = new SomeObj;
    obj->x = 5;
    printf("%d\n", obj->x);
}
 
//2. Второй вариант
 
void someFun2(SomeObj*& obj)
{
    obj = new SomeObj;
    obj->x = 5;
    printf("%d\n", obj->x);
}
 
int main()
{
    SomeObj* obj = NULL;
    someFun(obj);
    return 0;
}
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.04.2013, 15:25     При передачи указателя на обьект ошибка,а при передаче ссылки на указатель нет. Почему? #3
Не видно, как код используется.
Вот так будет ошибка:
C++
1
2
3
SomeObj* obj = NULL;
someFun(obj);
printf("%d\n", obj->x);
А так не будет:
C++
1
2
3
SomeObj* obj = NULL;
someFun2(obj);
printf("%d\n", obj->x);
Разница в том, что в первом варианте, в функции, работа идёт с копией указателя (передача по значению). При выходе из функции копия перестаёт существовать, obj по прежнему содержит NULL. Память, выделенная в функции, потеряна. Во втором варианте, работа идёт непосредственно с obj (передача по ссылке). После выхода из функции, obj содержит адресс выделенной памяти.
amator_IP
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 5
28.04.2013, 13:14  [ТС]     При передачи указателя на обьект ошибка,а при передаче ссылки на указатель нет. Почему? #4
Цитата Сообщение от alsav22 Посмотреть сообщение
Разница в том, что в первом варианте, в функции, работа идёт с копией указателя (передача по значению). При выходе из функции копия перестаёт существовать, obj по прежнему содержит NULL. Память, выделенная в функции, потеряна. Во втором варианте, работа идёт непосредственно с obj (передача по ссылке). После выхода из функции, obj содержит адресс выделенной памяти.
Спасибо! Понял в чем разница!)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.04.2013, 15:02     При передачи указателя на обьект ошибка,а при передаче ссылки на указатель нет. Почему?
Еще ссылки по теме:

ошибок в компиляции нет, а при работе выходит ошибка, почему? - C++
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;string.h&gt; const int n=2; struct a1{ //объявляем структуру char...

Почему при передаче по ссылке возвращается *this, а не this? - C++
Доброго времени суток! Изучаю перегрузку операции присваивания с указателем *this (ниже). Возврат идёт по ссылке на объект, то есть...

Где ошибка в передаче указателя на массив? - C++
через указатель на массив хочу в массив записать значние -1 или +1. гдето ошибка в синтаксисе. ПРошу помочь. ПОдозреваю что ошибка в...

Ошибка передачи указателя - C++
Здравствуйте, пытаюсь запустить программу, но выдает такую ошибку: C:\Users\user\Documents\MyPrograms\C++\lab2\lab2\thread.cpp:26:...

При одном кострукторе вызывется деструктор, при другом нет - почему? - C++
Есть класс дерево, в нём вложен класс лист. В подклассе лист есть два конструктора: Node(int key, Node NIL) и Node() #include &lt;iostream&gt;...

Ошибка при передаче в функцию - C++
Хочу передать в функцию строку и там ее заполнить, подчеркивает void karta(MyStruct s.karta,int size); И пишет: 1 IntelliSense:...


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

Или воспользуйтесь поиском по форуму:
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.04.2013, 15:02     При передачи указателя на обьект ошибка,а при передаче ссылки на указатель нет. Почему? #5
Как вариант, передавать по значению, возвращать и сохранять указатель:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SomeObj* someFun(SomeObj* obj)
{
    obj = new SomeObj;
    obj->x = 5;
    printf("%d\n", obj->x);
    return obj;
}
 
int  main()
{
    
    SomeObj* obj = NULL;
    obj = someFun(obj);
    printf("%d\n", obj->x);
        
    system("pause");
    return 0;
}
Yandex
Объявления
28.04.2013, 15:02     При передачи указателя на обьект ошибка,а при передаче ссылки на указатель нет. Почему?
Ответ Создать тему
Опции темы

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