【问题标题】:segmentation fault with pointer array指针数组的分段错误
【发布时间】:2018-06-06 23:10:33
【问题描述】:

尝试为我的指针数组输入数据时出现段错误。我对编码很陌生,所以任何帮助都会很棒。我的任务是创建一个指针数组,然后显示、交换它们然后对它们进行排序

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

【问题讨论】:

  • 为什么要使用指针和new?您应该更喜欢使用std::vector&lt;float&gt;。你根本不需要指针;使用参考。

标签: c++ arrays pointers segmentation-fault


【解决方案1】:

您只为外部数组分配了空间,但您还需要为每个内部浮点数分配空间。

所以在调用此行之前:

cin >> *speed[i];

你需要先为其分配空间:

speed[i] = new float;

【讨论】:

  • 为什么?为什么不只是float* speed = new float[arraySize];
  • 他可以。但他明确表示,任务是创建一个指针数组。
  • 重读,你是对的。任务很疯狂,但你是对的。
  • 他们至少可以将分配设为结构指针数组,以便动态分配内存......有点意义。不过,我想这会使排序练习变得非常复杂。
  • 感谢您的帮助,非常感谢!
【解决方案2】:

您的问题是您分配了一个浮点指针数组。您需要分配一个浮点数组。所以目前你没有为实际的浮点数分配内存。如果您这样做,您将分配该内存:

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

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

与另一个为浮动创建锯齿状内存的答案形成对比(一次 1 个,按需,不一定连续)。

【讨论】:

  • @KillzoneKid - 是的,我现在明白了。我希望他误解了这个要求,但如果他确认没有,我会杀死这个答案。
  • 是的,我的任务是创建一个指针数组...在此之前,我拥有它就像您的代码一样,它运行良好,但“拉伸挑战”是创建一个指针数组。不过谢谢!
  • @Jacobi97 - 更新了另一种可以为实际浮点数分配内存的方式。
  • @zzxyz 非常感谢您提供的所有帮助。编程太难了!但我为你们这样的人感到高兴!
  • @Jacobi97 - 绝对。 PS--您的教授可能正在寻找另一种方法(按需),但是对于这个问题,这两种方法都没有特别的意义,并且在现有数据结构(在这种情况下为浮点数组)上拍打“间接层” ) 几乎闻所未闻。
猜你喜欢
  • 1970-01-01
  • 2013-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-16
  • 2021-11-22
  • 1970-01-01
相关资源
最近更新 更多