c - 为什么我的程序给我一个中止陷阱 : 6 error?

标签 c macos

这段代码应该对字符串数组进行排序,但是在选择排序中主循环的第二次迭代周围,它给了我一个 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);
}

这是给我带来麻烦的代码。它编译时没有任何问题,并且还接受用户的输入,但之后它给了我 abort trap 的错误:6。可能是什么原因导致的? 提前致谢。

最佳答案

问题是当j == indexOfMin(或当j == i)时尝试复制,它尝试使用strcpy<复制重叠的内存区域 (您可以使用 memmove,而不是 strcpy)。来自man strcpy

The strcpy() function copies the string pointed to by src, including the terminating null byte ('\0'), to the buffer pointed to by 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);
}

还要记住释放(临时),否则肯定会发生内存泄漏。

关于c - 为什么我的程序给我一个中止陷阱 : 6 error?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35247696/

相关文章:

macos - macintosh 的安装程序软件?

security - IPSEC工具Racoon崩溃,无法重新启动

ruby - 如果因权限错误而失败,如何安装 gem 或更新 RubyGems

const char * 与 const char ** 函数参数

c - C : Comparison 的单元测试框架

objective-c - 如何从 NSUserDefaults 中的对象获取 key ?

macos - 你如何在远程 Linux ssh session 上运行的 vim 中猛拉到本地 OSX 剪贴板?

c - 我刚刚开始学习C : Can someone explain what the pointers and typecasting are doing in this code?

c - 动态分配多个结构的数组

c - 在头文件中调用枚举时遇到错误