Новый оператор вне основной функции - C ++ - PullRequest
0 голосов
/ 12 октября 2018

Почему этот код работает:

 //Things
 int **A;

 main(){

    //things
    A = new int*[n];
    for (int i = 0; i < n; i++) {
        A[i] = new int[m];
        }
   // things
}

И этот код не работает:

//Things
int **A;

void functionOutsideMain(int **A,int n, int m){
    A = new int*[n];
    for (int i = 0; i < n; i++) {
        A[i] = new int[m];
        }
    }

main(){

//Things
functionOutsideMain(A,n,m);
//Things
}

Когда я использую оператор new вне основной функции вОтдельная функция не будет работать.

Но если я использую оператор new внутри основной функции, это работает.

Можете ли вы объяснить мне, почему это происходит?

или

Если я что-то не так делаю.

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

В первом примере A - это просто глобальная переменная, которую main() использует напрямую.

Во втором примере functionOutsideMain() имеет свой собственный параметр A, который он использует, тогда какmain() по-прежнему использует глобальную переменную A.

functionOutsideMain() принимает свой A параметр значением .Когда main() передает глобальную переменную A в functionOutsideMain(), создается копия этого A, и поэтому любое значение, которое functionOutsideMain() присваивает его параметру A, не будетприменить к глобальной переменной A, поэтому main() не видит изменения.

Чтобы сделать то, что вы пытаетесь, вам нужно, чтобы functionOutsideMain() принял его A параметр по ссылке вместо:

void functionOutsideMain(int** &A, int n, int m)

Теперь любое значение functionOutsideMain(), назначенное его параметру A, будет присвоено глобальной переменной A, и, таким образом, будет замечено main().

0 голосов
/ 12 октября 2018

Эй, я не понял, что вы имели в виду, не работая, но возможные решения проблем могут быть

  • Нет необходимости снова передавать A в functionOutsideMain, так как A уже глобален

  • Когда вы передаете A в functionOutsideMain, фактический параметр A становится формальным параметром A, и теперь вот проблема, в C есть только передача по значению (в отличие от передачи по ссылке в C ++).Поэтому, когда вы передаете A в функцию, в функции создается новый указатель, и когда вы выделяете для нее кусок памяти, новый указатель указывает на эту память, а не на старый указатель, который вы используете в основной функции.

Одним из возможных решений для этого будет

void function_outside_main(int ***A, int n, int m) {
    int **Aptr = (*A);
    // And then use Aptr to allocate memory as you did
}

Иначе, не передавайте A как параметр функции, так как это глобальная переменная

...