指针数组的分段错误

时间:2018-06-06 23:10:33

标签: c++ arrays pointers segmentation-fault

我在尝试为指针数组输入数据时遇到段错误。我对编码很新,所以任何帮助都会很棒。我的任务是制作一个指针数组然后显示,交换它们而不是排序它们

#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 :(得分:4)

您只为外部阵列分配了空间,但您还需要为每个内部浮动分配空间。

所以在调用此行之前:

cin >> *speed[i];

您需要先为其分配空间:

speed[i] = new float;

答案 1 :(得分:1)

您的问题是您已经分配了一系列浮点指针。您需要分配一个浮点数组。所以目前你没有为实际花车分配内存。如果你这样做,你将分配那个记忆:

float *speed = new float[arraySize];

您不需要我能看到的2D /锯齿状阵列。如果从上面的代码开始,编译器错误应该引导您朝着这个方向前进。 (基本上,您将开始从代码中的很多位置删除*。)

修改 根据您误解的要求,可能的方法如下。另一个答案(不是我的那个)在更广泛的场景中比这更有意义,但希望这是另一个角度来思考你试图解决的那个相当武断的问题:

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;
}

忽略硬编码的常量等......这里的要点是我为浮点数创建了一个连续的内存区域,然后在它上面创建了一个浮点指针数组。请注意,我可以对指针数组进行排序,对原始数组没有任何影响。有很多更聪明的方法可以做到这一点,但是......看起来你正在学习原始指针,所以......

与另一个为浮点数创建锯齿状内存的答案(一次一个,按需提供,不一定是连续的)对比。