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