2017-02-02 2 views
-1

Основные выглядит, как это и она отлично компилируется, но когда он звонит, чтобы отобразить массив, PTR указывает на что-то пойдет не такПочему массив печати в одном файле, но отсутствующие номера при отправке в другой

#include "tools.h" 
#include <iostream> 

using namespace std; 


int main() 
{ 
    short int Arr1[] = { 5, 10 , 20 , 33, 444}; 
    short int Arr2[] = {8, 1, 22, 333, 4, 555, 6, 7777}; 
    short int* nptr ; 
    short int* ar1 = Arr1; 
    short int* ar2 = Arr2; 
    Display(ar1); 
    Display(ar2); 
    nptr = Concat(ar1,ar2); 
    Display(nptr); 

} 

Это файл, который я получаю мои функции от, дисплей, кажется, отлично работает в течение первых двух массивов и при печати массива в то же время в этом файле

#include <iostream> 

using namespace std; 

void Display (short int* a) 
{ 
    short int ArraySize = *a; 
    short int num = *a; 
    for(short int i = 0; i < ArraySize; ++i) 
     { 
     num = *(a+i); 
     cout << num; 
     cout << " "; 
     } 
    cout << endl; 
} 




short int* Concat(short int* a1, short int* a2) 
{  
    short int ArraySize = *a1 + *a2 + 1; 
    cout << ArraySize << endl; 
    short int Arr[ArraySize]; 
    short int num1 = *a1; 
    short int num2 = *a2; 
    short int* ptr; 
    ptr = &Arr[0]; 
    Arr[0] = ArraySize; 
    for(short int i = 0; i < *a1; i++) 
     { 
     num1 = *(a1+i); 
     Arr[i+1] = num1; 
     } 
    for (short int i = 0; i < *a2; i++) 
     {  
     num2 = *(a2+i); 
     Arr[i+*a1+1] = num2; 
     } 

    Display(ptr); 
    return ptr; 
} 

Тогда из пут выглядит следующим образом

5 10 20 33 444  // this line is fine 
8 1 22 333 4 555 6 7777 // this line is fine 
14 // fine 
14 5 10 20 33 444 8 1 22 333 4 555 6 7777 // the way the array should be printed 
14 5 10 20 3448 64 0 0 4736 96 0 0 2096 64 // the way it is printing and I need to fix 

Если у кого-то есть какие-либо сведения о том, почему это делается, или что я могу сделать, чтобы исправить это. Мне нужен массив для печати из основной программы, а не из файла.

Я также хотел бы упомянуть, что я довольно новичок в указателях на этом языке.

+0

Почему бы просто не использовать 'std :: vector' и его функции, такие как' insert() 'вместо таких вещей, как' Concat'? Кроме того, 'short int Arr [ArraySize];' недопустим C++, поскольку массивы должны быть объявлены с использованием констант времени компиляции, а не переменных. Плюс 'return ptr;' - вы возвращаете адрес локальной переменной - неопределенное поведение. С этим (C) кодом слишком много ошибок. – PaulMcKenzie

+1

[Фактический пример C++ того, что вы пытаетесь выполнить] (http://ideone.com/gMp6a3) – PaulMcKenzie

+0

Я не могу использовать вектор, я должен использовать указатели и iostream, и это все –

ответ

1

Хорошо, я думаю, что вы неясны в нескольких вещах.

Во-первых, вы не имеете дело с файлами здесь. Это массивы, выделенные в стеке. Они имеют определенный размер и не могут быть изменены.

Извинения, если мне кажется, что я говорю о вас, это не намерение, но, похоже, из того, что вы здесь делаете, вы не понимаете концепцию стека.

Ваша программа использует стек, чтобы отслеживать, где он находится, а также хранить локальные переменные. Когда вы вызываете функцию, она «толкает» обратный адрес в стек, а также выделяет пространство в стеке для локальных переменных в этой функции. Когда вы возвращаетесь из функции, она «выталкивает» стек и возвращается к предыдущему адресу. Когда это произойдет, локальные переменные функции перестают действовать.

В вашем коде вы объявляете локальную переменную в Concat(). Когда вы возвращаетесь из Concat(), стек выставляется, а указатель, который вы возвращаете к этой локальной переменной, больше недействителен.

Чтобы сделать то, что вы пытаетесь сделать, вам нужно объявить еще один массив в main(), который достаточно велик, чтобы держать то, что вам нужно. Вы передадите указатель на этот новый массив в качестве третьего параметра в Concat().

Не позволяйте негативам сбивать вас. В этом никто не родился.

+0

[Стоит обсудить концепцию области] (http://en.cppreference.com/w/cpp/language/scope). Ответ прорывается по краям области видимости, но вместо этого, по-видимому, атрибут поведения видимости для стека. Это немного вводит в заблуждение, но поскольку стеки реализуют локальную область гораздо чаще, чем нет, то ответ может быть обнаружен для любой системы OP. – user4581301

+0

Я действительно решил проблему, я использовал массив для хранения моих значений, когда это не так, но было неправильно для того, как я хотел, чтобы моя программа запускалась. Я использовал идею о том, что ptr является новым int, и он фиксировал всю проблему. –

+0

@ user4581301 Да, я пытался объяснить механику, почему программа печатала вывод, а не теорию, лежащую в ее основе. Он печатал мусор после возвращения, потому что эта часть стека уже недействительна. Не рекомендуется возвращать указатель на объект, выделенный в стеке. С современным C++ большинство людей больше не обращаются к исходным указателям. – Jamie

Смежные вопросы