我在下面有以下函数,它接受一个指针数组和一个大小。然后它按字母顺序对数组中的字符串进行排序。
但是,每次我在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;
}
}
答案 0 :(得分:1)
minElem = arr[startScan];
minElem = arr[index];
上面的代码暗示你有一个指针数组,你不会这样做。你拥有的是一个由string *myList
指向的字符串数组,并且你将这个(而不是数组)指针的地址传递给函数。
因此,您只有一个指针(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
。