指针数组的分段错误

Posted

技术标签:

【中文标题】指针数组的分段错误【英文标题】: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;。你根本不需要指针;使用参考。 【参考方案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--您的教授可能正在寻找另一种方法(按需),但是对于这个问题,这两种方法都没有特别的意义,并且在现有数据结构(在这种情况下为浮点数组)上拍打“间接层” ) 几乎闻所未闻。

以上是关于指针数组的分段错误的主要内容,如果未能解决你的问题,请参考以下文章

添加指向数组的指针时出现分段错误

Cray 指针和数组的分段错误:我做错了啥?

在 C++ 中使用指针的数组:访问返回的数组时出现分段错误

指针数组 C++ 的分段错误

结构中指向数组的 cudaFree 指针上的 CUDA 分段错误

将指向数组的指针传递给函数时出现分段错误(C++)