【问题标题】:segmentation fault with dynamic allocation and arrays/pointers动态分配和数组/指针的分段错误
【发布时间】:2013-10-03 10:03:47
【问题描述】:

我正在处理一项介绍内存和指针动态分配原则的作业。我过去做过一个简单的程序,它接受 5 个名字和 5 个分数,然后使用选择排序将它们按降序排列。我现在的任务是回到同一个程序并询问用户他们想输入多少分数,然后使用指针动态分配必要的内存量。这是我第一次使用指针和这些概念,所以我仍在努力弄清楚。

我得到了要编译的代码,但是一旦我输入任何整数来表示我想输入多少分数(这是程序要求的第一件事),我就会收到分段错误错误

我确定在调用和声明函数的过程中存在一些错误,所以如果有什么我只是拼命改变,请告诉我,但现在我不明白为什么我的程序在崩溃的地方崩溃。 这是我的代码

#include <iostream>
using namespace std;

void initializeData(string *names[], int *scores[], int num);
void displayData(string *names[], int *scores[], int num);
void sortData(string *names[], int *scores[], int num);

int main()
{
int num;
int **intPoint;
string **strPoint;

 cout << "How many scores would you like to enter?: ";
 cin >> num;

 cout << " core dumped? ";

*intPoint = new int[num];
*strPoint = new string[num];

initializeData(strPoint,intPoint,num);
sortData(strPoint,intPoint,num);
displayData(strPoint,intPoint,num); 

return 0;
}

void initializeData(string *names[], int *scores[], int num)
{
        for(int i=0;i<num;i++)
        {
                cout << "Please input the name for score: " << i+1 << ": " << endl;
                cin >> *(names[i]);   
                cout << "Please input the score for player: " << i+1 << ": " << endl;
                cin >> *(scores[i]);
        }
}

void sortData(string *names[], int *scores[], int num)
{
 int minIndex,minValue,x;
 string stringTemp;

             for(int i = 0;i<(num-1);i++)
             {
                minIndex = i;
                minValue = *(scores[i]);

                for(x= i+1;x<num;x++)
                {
                        if(*(scores[x]) > minValue)   
                         {
                          minValue = *(scores[x]);
                          minIndex = x;
                         }
                }

                *(scores[minIndex])=*(scores[i]);
                *(scores[i]) = minValue;

                stringTemp = *(names[minIndex]);
                *(names[minIndex]) = *(names[i]);
                *(names[i]) = stringTemp;
        }
}

void displayData(string *names[], int *scores[], int num)
{
cout << "Top scorers: " << endl;
         for(int i=0;i<num;i++)
        {
                cout << names[i] <<": ";
                cout << scores[i] << endl;
        }
}

和我当前的输出: 您想输入多少分?:10 分段错误(核心转储)

无论我放什么 int 都会发生这种情况。我在后面放了一个 cout 声明 辛

非常感谢任何帮助。抱歉,这是有史以来最基本的错误。

【问题讨论】:

    标签: c++ arrays function pointers dynamic-memory-allocation


    【解决方案1】:
    int **intPoint;
    

    此时,在您的代码中,intPoint 没有指向任何内容,因为您尚未为其分配值。

    *intPoint = new int[num];
    

    然后你取消引用它,但它没有指向任何东西。

    试试:

    int *intPoint;
    
    intPoint = new int[num];
    

    现在您正在设置intPoint,使其指向您分配的整数。

    【讨论】:

    • 谢谢。我试图使用一个指针还没有指向的值,对吧?我不太了解双指针,所以我真的没有使用它们的业务,但不知何故我就是这样编译的。一旦我改变了它,我就可以返回并将我的所有函数从参数中的期望数组更改为指向数组的指针。这听起来对吗?
    • 我意识到这已经很晚了,但是说“你正在将 intPoint 设置为指向整数的指针......”是不准确的,因为 intPoint 指针。它实际上应该说“intPointvalue 到新整数数组的 address...”
    【解决方案2】:

    你得到一个分段错误的原因是你取消了一个未初始化的指针。

    int **intPoint; // intPoint is declared a pointer to a 'pointer to an int';
                    // but currently it points to nothing
    *intPoint = new int[num]; // *intPoint "dereferences" intPoint, i.e., assigns w/e it 
                              // pointed to (which is nothing) to a pointer.
    

    就像其他人建议的那样,这里不需要双指针。

    int *intPoint; // intPoint is a pointer to an int
    intPoint = new int[num]; // notice how we didn't dereference intPoint.
                             // all we did was assign to our newly minted memory.
    

    【讨论】:

    • 我读了很多关于我应该如何注意今天在尝试之前不要这样做并且无论如何都这样做了。不过,当它对我来说这样拼写时,它更有意义。谢谢。
    【解决方案3】:

    使用 std::vector 代替 int 或字符串数​​组。

    说,

      std::vector<int> scores;
      std::vector<string> names;
    

    这样您就可以避免所有的麻烦。这是简单而优雅的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-10
      • 2016-01-02
      • 1970-01-01
      • 2013-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多