这段代码应该对字符串数组进行排序,但是在选择排序的主循环的第二次迭代中,它给出了一个Abortion Trap:6错误。我在Mac上的终端上运行它。这是代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int letSize = 20;
int vecSize;
char **array1;
void selectionSort (int low, int high)
{
char *temp = malloc ((letSize + 1) * sizeof (char));
int i = 0, j = 0;
for (i = low; i < high - 1; i++) {
int indexOfMin = i;
for (j = i + 1; j < high; j++)
if (strcmp (array1[j], array1[indexOfMin]) < 0)
indexOfMin = j;
//after second main loop, error occurs
strcpy (temp, array1[i]);
strcpy (array1[i], array1[indexOfMin]);
strcpy (array1[indexOfMin], temp);
}
}
int main ()
{
int i, j;
printf ("Enter size of items to be sorted: ");
scanf ("%d", &vecSize);
array1 = malloc (vecSize * sizeof (char *));
for (i = 0; i < vecSize; i++)
array1[i] = malloc ((letSize + 1) * sizeof (char));
srand (time (NULL));
for (i = 0; i < vecSize; i++) {
for (j = 0; j <= letSize; j++) {
if (j != letSize) {
char randLet = 'A' + (random () % 26);
array1[i][j] = randLet;
} else
array1[i][j] = '\0';
}
}
selectionSort (0, vecSize);
}
这是给我带来麻烦的代码。它编译没有任何问题,它也需要用户的输入,但在病房之后它给了我中止陷阱的错误:6。是什么导致这个? 提前谢谢。
答案 0 :(得分:0)
问题是您在j == indexOfMin
(或j == i
)尝试使用strcpy
复制重叠内存区域时尝试复制(您可以使用memmove
,而不是strcpy
{1}})。来自man strcpy
strcpy()函数复制src指向的字符串,包括 终止空字节(&#39; \ 0&#39;),指向dest指向的缓冲区。
The strings may not overlap
,....
您只需要检查并复制j != indexOfMin
,以防止尝试将字符串复制到自身上。 e.g:
void selectionSort (int low, int high)
{
char *temp = malloc ((letSize + 1) * sizeof (char));
int i = 0, j = 0;
for (i = low; i < high - 1; i++) {
int indexOfMin = i;
for (j = i + 1; j < high; j++)
if (strcmp (array1[j], array1[indexOfMin]) < 0)
if (j != indexOfMin) {
indexOfMin = j;
strcpy (temp, array1[i]);
strcpy (array1[i], array1[indexOfMin]);
strcpy (array1[indexOfMin], temp);
}
}
free (temp);
}
还记得free (temp)
或者你保证有内存泄漏。