Передача динамических массивов в функции - PullRequest
2 голосов
/ 07 февраля 2012

Я создал 2 динамических массива в основной функции.Я передал их обоих в функцию по ссылке.Затем я копирую данные из меньшего динамического массива в больший динамический массив.Я удаляю меньший динамический массив.Назначьте адрес большего динамического массива меньшему динамическому массиву.Теперь в идеале массив arr должен иметь размер 10. Однако, когда я пытаюсь напечатать 6-й элемент массива в основном, он вылетает.Пожалуйста, посмотрите на код ниже:

#include <iostream>
#include <string> 

using namespace std; 

void func(string * arr, string * brr); 

int main()             
{ 
    string* arr = new string[5]; 
    arr[0] = "hello0"; 
    arr[1] = "hello1"; 
    arr[2] = "hello2"; 
    arr[3] = "hello3"; 
    arr[4] = "hello4"; 

    string* brr = new string[10]; 


    func(arr, brr); 

    for(int i = 0; i < 6; i++) 
        cout << arr[i] << endl; 

    return 0; 
} 

void func(string * arr, string * brr) 
{ 
    for(int i = 0; i < 5; i++) 
        brr[i] = arr[i]; 

    for(i = 0; i < 5; i++) 
        cout << brr[i] << endl; 

    delete []arr; 

    arr = brr; 

    arr[5] = "hello5";
} 

Ответы [ 3 ]

3 голосов
/ 07 февраля 2012

Эта строка абсолютно не влияет на звонящего:

arr = brr;

Таким образом, после вызова arr точно указывает, куда он раньше указывал до - на недопустимую область памяти (поскольку вы ее удалили).

Если это будет вопрос C, я бы посоветовал вам использовать указатель на указатель (string **arr). Тем не менее, я чувствую, что это неприятно в программе на C ++. Может быть, вы хотите использовать ссылку где-нибудь?

2 голосов
/ 07 февраля 2012

Установить эту подпись для функции

void func(string * & arr, string * & brr)
0 голосов
/ 07 февраля 2012

@ cnicutar правильно диагностировал проблему;Вам также нужно будет передать arr по ссылке (ссылка на POINTER, а не на массив), или если у Fund есть новое значение arr, которое может назначить вызывающая сторона.

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