对指针数组进行排序。

时间:2016-04-13 06:25:18

标签: c++ sorting pointers

我在下面有以下函数,它接受一个指针数组和一个大小。然后它按字母顺序对数组中的字符串进行排序。

但是,每次我在main函数中运行该函数时,程序都会崩溃。我的代码可能有什么问题?

int main()
{
    int size = 3;
    string *myList= new string[size];
    myList[0] = "Hello";
    myList[1] = "What's your name";
    myList[2] = "How are you?";
    arrSelectSort(&myList, size);

    return 0;
}
void arrSelectSort(string *arr[], int size)
{
    int startScan, minIndex;
    string *minElem = nullptr;
    for (startScan = 0; startScan < (size - 1); startScan++) {
        minIndex = startScan;
        minElem = arr[startScan];
        for (int index = startScan + 1; index < size; index++) {
            if (*(arr[index]) < *minElem) {
                minElem = arr[index];
                minIndex = index;
            }
        }
        arr[minIndex] = arr[startScan];
        arr[startScan] = minElem;
    }
}

2 个答案:

答案 0 :(得分:1)

minElem = arr[startScan];
minElem = arr[index];

上面的代码暗示你有一个指针数组,你不会这样做。你拥有的是一个由string *myList指向的字符串数组,并且你将这个(而不是数组)指针的地址传递给函数。

enter image description here

因此,您只有一个指针(myList)指向存储字符串数组的内存位置,最终会在循环中显示string* arr[]=&myList;arr[index];之类的内容(当index>0)从包含垃圾数据(不是有效指针)的内存位置访问值,并尝试遵循它将导致错误。

答案 1 :(得分:0)

这是工作代码

#include<cstdio>
#include<string>
#include<iostream>
using namespace std;

void arrSelectSort(string *arr, int size)
{
    int startScan, minIndex;
    string minElem;
    for (startScan = 0; startScan < (size - 1); startScan++) {
        minIndex = startScan;
        minElem = arr[startScan];
        for (int index = startScan + 1; index < size; index++) {
            if (arr[index] < minElem) {
                minElem = arr[index];
                minIndex = index;
            }
        }
        arr[minIndex] = arr[startScan];
        arr[startScan] = minElem;
    }
}

int main()
{
    int size = 3;
    string *myList= new string[size];
    myList[0] = "Hello";
    myList[1] = "What's your name";
    myList[2] = "How are you?";
    arrSelectSort(myList, size);

    for(int i=0;i<size;i++) {
        cout << myList[i] << endl;
    }
    return 0;
}
  • arrSelectSort函数的参数正在使用:string *arr。你想要对字符串的指针进行排序是很奇怪的。使用*arr[]表示您想要对(字符串数组)
  • 的指针进行排序
  • minElem仅为string数据类型。 minElem将包含由arr指向的字符串,因此它只是string,而不是string的指针
  • 仅比较:if (arr[index] < minElem)。要访问arr指向的字符串,我们可以像arr
  • 数组一样访问它
  • 调用函数:arrSelectSort(myList, size);arrSelectSort函数的参数更改为*arr