ошибка сегментации с массивом указателей - PullRequest
0 голосов
/ 07 июня 2018

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

#include <iostream>
using namespace std;

float getValueFromPointer(float* thePointer)
{
   return *thePointer;
}

float* getMinValue(float* a, float* b)
{
   if (*a < *b)
   {
      return a;
   }
   else
   {
      return b;
   }
}

int main()
{
   int arraySize;
   cout << "Enter the array size: ";
   cin >> arraySize;

   float** speed = new float*[arraySize]; // dynamically allocated array

   for(int i = 0; i < arraySize; i++)
   {
      cout << "Enter a float value: ";
      cin >> *speed[i];
   }

    // Core Requirement 2
   for (int i = 0; i < arraySize; i++)
   {
      float value = getValueFromPointer(*speed+i);
      cout << "The value of the element " << i << " is: ";
      cout << value << endl;
   }



   //float *pointerToMin = getMinValue(&speed[0], &speed[arraySize - 1]);
   //cout << *pointerToMin << endl;

   delete [] speed;
   speed = NULL;
   return 0;
}

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Вы выделили пространство только для внешнего массива, но вам также необходимо выделить место для каждого из внутренних чисел.

Итак, перед вызовом этой строки:

cin >> *speed[i];

Вам нужносначала выделить для него место:

speed[i] = new float;
0 голосов
/ 07 июня 2018

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

float *speed = new float[arraySize];

У вас нет необходимости в двумерном / зубчатом массиве, который я вижу.Если вы начнете с кода, приведенного выше, ошибки компилятора должны привести вас в правильном направлении.(По сути, вы начнете удалять * из множества мест в вашем коде.)

EDIT Исходя из вашего требования, которое я неправильно понял, возможный подход заключается в следующем.Другой ответ (тот, который не мой) имеет смысл в более широких сценариях, чем этот, но, надеюсь, это своего рода другой угол, чтобы подумать об этой довольно произвольной проблеме, которую вы пытаетесь решить:

int main()
{
  float *pFloats = new float[10];
  float **ppFloats = new float*[10];
  //assign float values and pointers to them in same loop
  for (int i = 0; i < 10; i++)
  {
    pFloats[i] = i;
    ppFloats[i] = &pFloats[i];
  }
  //swap two arbitrary pointers
  float *pTemp = ppFloats[4];
  ppFloats[4] = ppFloats[5];
  ppFloats[5] = pTemp;

  //print our float array
  for (int i = 0; i < 10; i++)
    printf("%f\n", pFloats[i]);
  //print our float array *through* our pointers
  for (int i = 0; i < 10; i++)
    printf("%f\n", *ppFloats[i]);
  delete[] ppFloats;
  delete[] pFloats;
}

Игнорировать жестко запрограммированные константы и т. Д. Суть в том, что я создал непрерывную область памяти для поплавков, а затем создал массив указателей поплавков поверх него.Обратите внимание, что я могу отсортировать массив указателей с нулевым воздействием на исходный массив.Есть намного более умных способов сделать это, но ... похоже, вы изучаете необработанные указатели, поэтому ...

Сравните с другим ответом, который создает зазубренную память дляfloat (по одному, по требованию, не обязательно смежный).

...