簡體   English   中英

為什么我的程序給我一個中止陷阱:6錯誤?

[英]Why is my program giving me an Abort Trap: 6 error?

這段代碼應該對字符串數組進行排序,但是在選擇排序中主循環的第二次迭代前后,它給了我一個異常終止陷阱: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.可能是什么原因造成的? 提前致謝。

問題是您嘗試在j == indexOfMin (或當j == i )時嘗試進行復制,該嘗試嘗試使用strcpy復制重疊的內存區域(可以使用memmove ,而不是strcpy )。 man strcpy

strcpy()函數將src指向的字符串(包括終止的空字節('\\ 0'))復制到dest指向的緩沖區。 The strings may not overlap ,.....

您僅需要檢查並僅在j != indexOfMin進行復制,以防止嘗試在其自身上復制字符串。 例如:

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)否則您將保證有內存泄漏。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM