C 检测到堆损坏-使用字符串实现mergesort

C 检测到堆损坏-使用字符串实现mergesort,c,string,sorting,mergesort,heap-corruption,C,String,Sorting,Mergesort,Heap Corruption,之前,我自己实现了一个经典的mergesort,它对int数组进行排序。请遵循以下代码: #include <stdio.h> #include <stdlib.h> void merge(int a[], int b[], int c[], int m, int n) { int i = 0, j = 0, k = 0; while (i < m && j < n) if (a[i] < b[j]

之前,我自己实现了一个经典的mergesort,它对int数组进行排序。请遵循以下代码:

#include <stdio.h>
#include <stdlib.h>

void merge(int a[], int b[], int c[], int m, int n)
{
    int   i = 0, j = 0, k = 0;

    while (i < m && j < n)
        if (a[i] < b[j])
            c[k++] = a[i++];
        else
            c[k++] = b[j++];
    while (i < m)
        c[k++] = a[i++];
    while (j < n)
        c[k++] = b[j++];
}

void mergesort_pot2(int key[], int n)
{
    int    j, k, *w;

    w = calloc(n, sizeof(int));
    for (k = 1; k < n; k *= 2) {
        for (j = 0; j < n - k; j += 2 * k)
            merge(key + j, key + j + k, w + j, k, k);
        for (j = 0; j < n; ++j)
            key[j] = w[j];
    }
    free(w);
}

void mergesort(int key[], int n)
{
    int i, cnt = 0, *x, v, b = 0, vv = 0, bb;

    while (n - cnt > 0)
    {
        for (i = 1; i < n - cnt; i *= 2);
        if (i > n - cnt)
            i /= 2;

        x = calloc(i, sizeof(int));                     

        v = 0;
        while (v < i)
            x[v++] = key[b++];

        mergesort_pot2(x, i);                           

        bb = 0;
        while (bb < i)                                  
            key[vv++] = x[bb++];

        free(x);                                        
        cnt += i;                                       
    }
}

int main(void)
{
    int   i, key[] = { 4, 3, 1, 67, 55, 8, 0, 4,
        -5, 37, 7, 4, 2, 9, 1, -1, 100};

    printf("Before mergesort:\n");
    for (i = 0; i < 17; ++i)
        printf("%4d", key[i]);
    putchar('\n');

    mergesort(key, 17);

    printf("After mergesort:\n");
    for (i = 0; i < 17; ++i)
        printf("%4d", key[i]);
    putchar('\n');
    return 0;
}
现在,作为练习,我修改了该代码,使其能够与char*数组一起工作,但我在某些地方遇到了堆错误。我试图用Dr.Memory调试它,但它使我的visual studio 2013无法工作,但这是另一个故事

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define LENGTH      5

void merge(char *a[], char *b[], char *c[], int m, int n)
{
    int   i = 0, j = 0, k = 0;

    while (i < m && j < n)
        if (strcmp(a[i], b[j]) < 0)
            c[k++] = a[i++];
        else
            c[k++] = b[j++];
    while (i < m)
        c[k++] = a[i++];
    while (j < n)
        c[k++] = b[j++];
}

void mergesort_pot2(char *key[], int n)
{
    int    j, k;
    char **w;
    int i;

    w = calloc(n, sizeof(char *));
    for (i = 0; i < n; ++i)
        w[i] = calloc(strlen(key[i]), sizeof(char));

    for (k = 1; k < n; k *= 2) {
        for (j = 0; j < n - k; j += 2 * k)
            merge(key + j, key + j + k, w + j, k, k);
        for (j = 0; j < n; ++j)
            key[j] = w[j];
    }
    for (i = 0; i < n; ++i)
        free(w[i]);
    free(w);
}

void mergesort(char *key[], int n)
{
    int i, cnt = 0, v, b = 0, vv = 0, bb;
    char **x;
    int y;

    while (n - cnt > 0)
    {
        for (i = 1; i < n - cnt; i *= 2);
        if (i > n - cnt)
            i /= 2;

        x = calloc(i, sizeof(char *));

        for (y = 0; y < i; ++y)
            x[y] = calloc(strlen(key[y]), sizeof(char));                     
        v = 0;
        while (v < i)
            strcpy(x[v++], key[b++]);

        mergesort_pot2(x, i);                           

        bb = 0;
        while (bb < i)                                  
            strcpy(key[vv++], x[bb++]);

        for (y = 0; y < i; ++y)
            free(x[y]);
        free(x);                                        

        cnt += i;
    }
}

int main(void)
{
    int   i;
    char *key[LENGTH] = { "Hi", "this", "is", "a", "test" };

    printf("Before mergesort:\n");
    for (i = 0; i < LENGTH; ++i)
        printf("%s ", key[i]);
    putchar('\n');

    mergesort(key, LENGTH);

    printf("After mergesort:\n");
    for (i = 0; i < LENGTH; ++i)
        printf("%s ", key[i]);
    putchar('\n');
    return 0;
}

您是否收到特定的错误代码或消息?检测到堆损坏:在0x0145a718 CRT的正常块66检测到应用程序在堆缓冲区结束后写入内存后,您没有必要将其转换为int-to-char*。其中一个原因是callocstrlenkey[i]。这对于strcpy来说太小了。虽然我把programint修改为char*,但我认为这是错误的基本算法。我知道,要成为一段优雅的简单代码还远远不够,但是works@wing试试-100而不是100你是对的!我正在修理它!非常感谢您在这两个应用程序上的贡献!
void mergesort_pot2(char *key[], int n)
{
    int    j, k;
    char **w;

    w = calloc(n, sizeof(char*));
    for (k = 1; k < n; k *= 2) {
        for (j = 0; j < n - k; j += 2 * k)
            merge(key + j, key + j + k, w + j, k, k);
        for (j = 0; j < n; ++j)
            key[j] = w[j];
    }
    free(w);
}

void mergesort(char *key[], int n)
{
    int i, cnt = 0, v, b = 0, vv = 0, bb;
    char **x;

    while (n - cnt > 0)
    {
        for (i = 1; i < n - cnt; i *= 2);
        if (i > n - cnt)
            i /= 2;

        x = calloc(i, sizeof(char *));

        v = 0;
        while (v < i)
            x[v++] = key[b++];

        mergesort_pot2(x, i);                           

        bb = 0;
        while (bb < i)                                  
            key[vv++]= x[bb++];

        free(x);                                        

        cnt += i;
    }
}