2013-04-03 4 views
0

В настоящее время я читаю книгу, чтобы освежить память на C++. Глава, в которой я участвую, связана с динамическим распределением памяти. Я занимаюсь практикой, и у меня возникают проблемы с выяснением того, что не так с моей программой. ВопросПроблемы с массивами и указателями

«Написать программу, которая позволяет пользователям отслеживать последний раз, когда они разговаривали с каждым из своих друзей. Пользователи должны иметь возможность добавлять новых друзей (сколько угодно!) И хранить количество дней назад, чтобы они в последний раз разговаривали с каждым другом. Пусть пользователи обновляют это значение (но не позволяйте им вводить фиктивные числа, например, отрицательные значения). Позвольте отобразить список, отсортированный по именам друзей, тем, как недавно это было так как они разговаривали с каждым другом ».

На данный момент я просто пытаюсь заставить программу правильно хранить вход пользователя.

Он падает после того, как я вхожу в 5 друзей, поэтому я предполагаю, что он пишет над массивом, но функция Resize должна позаботиться об этом.

Он мой код

#include <iostream> 
#include <cstdlib> 
#include <string> 

using namespace std; 

struct Friend 
{ 
    string friends; 
    int days; 
}; 

Friend Resize(Friend* p_array, int* size_of_array); 

int main() 
{ 
    struct Friend f; 
    int quit = 1; 
    int array_size = 5; 
    int number_of_friends = 0; 
    Friend *p_array = new Friend [array_size]; 

    while(quit != 0) 
    { 
     cout << "Enter a friends name.\n"; 
     cin >> f.friends; 
     cout << "Enter the number of days sence you last saw them.\n"; 
     cin >> f.days; 
     cout << "Enter '0' to quit the program.\n"; 
     cin >> quit; 

     if(array_size == number_of_friends) 
     { 
     Resize(p_array, &array_size); 
     } 

     p_array[number_of_friends] = f; 

     number_of_friends++; 
    } 

    //print the array 
    cout << endl; 
    for(int i = 0; i < sizeof(p_array); i++) 
    { 
    cout << p_array[i].friends << " " << p_array[i].days << endl; 
    } 

    //delete the array 
    delete [] p_array; 


    return 0; 
} 

Friend Resize(Friend* p_array, int* size_of_array) 
{ 
    *size_of_array *= 2; 
    Friend *p_new_array = new Friend [*size_of_array]; 

    for(int i = 0; i < *size_of_array; i++) 
    { 
    p_new_array[i] = p_array[i]; 
    } 

    delete [] p_array; 

    p_array = p_new_array; 
} 
+0

Куда он падает? – chris

+0

Кстати, 'sizeof (p_array)' is 'sizeof (Friend *)'. Это не имеет никакого отношения к количеству элементов в вашем «массиве». – chris

+0

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

ответ

2
p_array = p_new_array; 

Это присвоит локальный Friend* параметр для p_new_array.

Therefor

p_array[number_of_friends] = f; 

является доступ к инвалидному объекта.

Declare Resize в

Friend Resize(Friend** p_array, int* size_of_array) 

или

Friend Resize(Friend*& p_array, int* size_of_array) 

, чтобы решить эту проблему.

0

Аварийный сигнал из-за функции изменения размера. Следующая строка вызывает сбой:

for(int i = 0; i < *size_of_array; i++) 
{ 
    p_new_array[i] = p_array[i]; 
} 

Вы удвоенный размер size_of_array, но p_array имеет только 5 элементов. Таким образом, это означает, что вы выходите из пределов здесь.

0

Проблема в том, что, хотя ваш код изменения размера является ОК, он меняет указатель внутри функции Resize. Указатель в главном никогда не изменяется. Другая ошибка заключается в том, что вы удваиваете переменную size_of_array до того, как скопируете массив, чтобы в итоге вы копировали элементы из старого массива, который не существует.

Измените функцию как этот

Friend* Resize(Friend* p_array, int* size_of_array) 
{ 
    Friend *p_new_array = new Friend [*size_of_array * 2]; 

    for(int i = 0; i < *size_of_array; i++) 
    { 
    p_new_array[i] = p_array[i]; 
    } 

    delete [] p_array; 

    *size_of_array *= 2; 
    return p_new_array; 
} 

А потом в главном использовать его как это

if(array_size == number_of_friends) 
{ 
    p_array = Resize(p_array, &array_size); 
} 

Таким образом, функция изменения размера возвращает новый массив, и назначить его p_array переменной main.,

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