функция возвращает указатель на int - PullRequest
4 голосов
/ 18 августа 2010

Мой main () падает после вызова add (4).

Как я понимаю, int * add должен возвращать указатель на целое число.Тогда я должен уметь сказать:

int * a = add (3);

чтобы вернуть указатель на int.

Пожалуйста, объясните, что я делаю неправильно.

#include <cstdlib>
#include <iostream>

using namespace std;

int* add (int a) {
   int * c, d;
   d = a + 1;
   *c = d;
   cout << "c = " << c << endl; 
   return c;
}

int main(int argc, char *argv[])
{
    int a = 4;

    int * c;

    c = add(4); 

    system("PAUSE");
    return EXIT_SUCCESS;
}

Ответы [ 4 ]

8 голосов
/ 18 августа 2010

Проблема в том, что вы объявили int*, но не дали ему ничего для указания.Что вам нужно сделать, это инициализировать его с помощью ячейки памяти (проверка ошибок не указана)

int* c = new int();
...
*c = d;  // Now works

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

Лучшее решение - использовать ссылки.У указателей есть несколько неприятных атрибутов, включая унифицированные значения, NULL, необходимость освобождения и т. Д. Большинство из них отсутствуют в ссылках.Вот пример того, как использовать ссылки в этом сценарии.

void add (int a, int& c) {
   int d;
   d = a + 1;
   c = d;
   cout << "c = " << c << endl; 
}

int c;
add(4, c);
5 голосов
/ 18 августа 2010

В

 *c = d;

указатель c не инициализирован, поэтому ваша программа работает с неопределенным поведением. Вместо этого вы можете сделать что-то вроде следующего:

void add( int what, int* toWhat )
{
    (*toWhat) += what;
}

и назовите это так:

int initialValue = ...;
add( 4, &initialValue );
3 голосов
/ 18 августа 2010

Вы никогда не выделяете память для указателя c.Указатели должны ссылаться на действительную память, и вы должны самостоятельно выделить эту память с помощью вызова new, например, написать

int* c = new int();

в функции add.Теперь c указывает на допустимый блок памяти, достаточно большой, чтобы вместить int.Когда вы закончите с этой памятью, позвоните delete c, чтобы освободить ее и вернуть обратно в систему.

1 голос
/ 18 августа 2010

Вы получаете ошибку, потому что c является неинициализированным указателем, поэтому это неопределенное поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...