2013-09-27 9 views
0

Я работаю над назначением, которое представляет принципы динамического распределения памяти и указателей. В прошлом я сделал простую программу, которая приняла 5 имен и 5 баллов, а затем использовала сортировку, чтобы поместить их в порядке убывания. Теперь мое задание - вернуться к той же самой программе и задать пользователю количество баллов, которые они хотели бы ввести, а затем использовать указатели для динамического выделения необходимого объема памяти. Это мой первый опыт работы с указателями и этими понятиями, поэтому я все еще пытаюсь понять все это.ошибка сегментации с динамическим распределением и массивами/указателями

Я получил код для компиляции, но я получаю ошибку ошибки сегментации, как только я ввести любое целое число для сколько баллов я хотел бы вход (который является первым, что просит программа)

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

#include <iostream> 
using namespace std; 

void initializeData(string *names[], int *scores[], int num); 
void displayData(string *names[], int *scores[], int num); 
void sortData(string *names[], int *scores[], int num); 

int main() 
{ 
int num; 
int **intPoint; 
string **strPoint; 

cout << "How many scores would you like to enter?: "; 
cin >> num; 

cout << " core dumped? "; 

*intPoint = new int[num]; 
*strPoint = new string[num]; 

initializeData(strPoint,intPoint,num); 
sortData(strPoint,intPoint,num); 
displayData(strPoint,intPoint,num); 

return 0; 
} 

void initializeData(string *names[], int *scores[], int num) 
{ 
     for(int i=0;i<num;i++) 
     { 
       cout << "Please input the name for score: " << i+1 << ": " << endl; 
       cin >> *(names[i]); 
       cout << "Please input the score for player: " << i+1 << ": " << endl; 
       cin >> *(scores[i]); 
     } 
} 

void sortData(string *names[], int *scores[], int num) 
{ 
int minIndex,minValue,x; 
string stringTemp; 

      for(int i = 0;i<(num-1);i++) 
      { 
       minIndex = i; 
       minValue = *(scores[i]); 

       for(x= i+1;x<num;x++) 
       { 
         if(*(scores[x]) > minValue) 
         { 
          minValue = *(scores[x]); 
          minIndex = x; 
         } 
       } 

       *(scores[minIndex])=*(scores[i]); 
       *(scores[i]) = minValue; 

       stringTemp = *(names[minIndex]); 
       *(names[minIndex]) = *(names[i]); 
       *(names[i]) = stringTemp; 
     } 
} 

void displayData(string *names[], int *scores[], int num) 
{ 
cout << "Top scorers: " << endl; 
     for(int i=0;i<num;i++) 
     { 
       cout << names[i] <<": "; 
       cout << scores[i] << endl; 
     } 
} 

и мой выходной ток: Сколько баллов вы хотите ввести ?: 10 вина Сегментация (ядро сбрасывали)

который происходит независимо от того, что Int я положил там. Я положил заявление cout после cin < < num; чтобы узнать, получилась ли эта программа далеко, но это никогда не происходит.

Любая помощь очень ценится. Извините, если это самая простая ошибка.

ответ

2
int **intPoint; 

На данный момент в вашем коде, intPoint не указывает ни на что, так как вы не присвоили ему значение.

*intPoint = new int[num]; 

Затем вы разыгрываете его, но это ни на что не указывает.

Try:

int *intPoint; 

intPoint = new int[num]; 

Теперь вы настраиваете intPoint «s значение так, что он указывает на целые числа вы выделенных.

+0

спасибо. Я пытался использовать значение, которое указатель еще не указывал, верно? Я не совсем понимаю двойные указатели, поэтому у меня действительно не было бизнеса, использующего их, но почему-то это то, как я получил компиляцию.Как только я изменил это, я смог вернуться и изменить все свои функции, ожидая массивы в своих параметрах указателям, указывающим на массивы. Правильно ли это звучит? –

+1

Я понимаю, что это поздно, но говоря: «вы устанавливаете значение * intPoint' для указателя на целые числа ... »неточно, так как« intPoint »* - это указатель. Он должен фактически сказать «значение * intPoint' * к * адресу * нового массива целых чисел ...» – ray

+0

@ray Спасибо. Исправлена. –

0

Причина, по которой возникает ошибка сегментации, заключается в том, что вы разыгрываете неинициализированный указатель.

int **intPoint; // intPoint is declared a pointer to a 'pointer to an int'; 
       // but currently it points to nothing 
*intPoint = new int[num]; // *intPoint "dereferences" intPoint, i.e., assigns w/e it 
          // pointed to (which is nothing) to a pointer. 

Как и другие, вы не указали здесь двойную указатель.

int *intPoint; // intPoint is a pointer to an int 
intPoint = new int[num]; // notice how we didn't dereference intPoint. 
         // all we did was assign to our newly minted memory. 
+0

Я много читал о том, как я должен помнить, что сегодня не делаю этого, прежде чем пытаться это сделать и все равно. Это имеет больше смысла, когда это излагает это для меня. Спасибо. –

0

Используйте std :: vector в месте массива int или string.

говорят,

std::vector<int> scores; 
    std::vector<string> names; 

Таким образом, вы можете избежать всех неприятностей. Это просто и элегантно.

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