找不到当前函数的

找不到当前函数的

我正在C语言上的16384数组上实现插入排序。
排序算法运行正常,但当遇到free(inser)命令时,调试器将输出“找不到当前函数的边界”错误。
这可能是因为我在64位计算机上使用32位mingw造成的吗?

int main(void) {
    int i,t,j;
    int *inser = malloc(sizeof(int)*16384);
    int *shell = malloc(sizeof(int)*16384);
    srand(time(NULL));

    for(i=0;i<=16384;i++){
        *(inser+i) = rand()% 17000;;
        *(shell+i) = *(inser+i);
    }


    for(i=1;i<=16384;i++){
        j = i-1;
        while((*(inser+i)<*(inser+j)) && (j >=0)){
            t = *(inser+i);
            *(inser+i) = *(inser+j);
            *(inser+j) = t;
            j--;
            i--;
        }
    }

    for(i=0;i<=16384;i++){
        printf("%d\t",*(inser+i));
    }

    free(inser);
    free(shell);

    return 0;
}

最佳答案

除了其他人指出的循环边界错误之外,请看下面标记为“WARNING”的行(我还清理了您的代码,使其更具可读性)。在这条线上,当j开始为零时,j变成-1。此值将在此处使用:

while( inser[i] < inser[j] && j >= 0 ) { ... }

逻辑“and”&&是一个快捷运算符:其左侧(LHS)始终被求值,而右侧仅在LHS求值为“true”时才被求值。因此,总是在最后一次内环迭代之后计算inser[-1],因为j在最后一次循环测试失败之前已经被j--从0减至-1,而不是在j>=0被计算之前。
您可以将操作数交换到inser[j]以避免此问题,得到:
while( j>=0 && inser[i] < inser[j] ) { ... }

除此之外,我不能说你的(修正的)代码是否会按预期的方式运行。
打开所有编译器警告,可能会捕获一些错误。
#include <stdio.h>
#include <stdlib.h>

/* Avoid magic numbers */
#define ARRAY_SIZE   (16384)
#define RAND_CEILING (17000)

int main(void) {
    int i;          /* Indexing and iteration variable. */
    int j;          /* Indexing and iteration variable. */
    int t;          /* Temporary variable for swapping. */
    int *inser;     /* Sorted array.                    */
    int *shell;     /* Original array.                  */


    /* Always check the return value of malloc() */
    inser = malloc(ARRAY_SIZE*sizeof(*inser));
    if( inser == NULL ) {
        fprintf(stderr, "Call to malloc() failed for 'inser'.\n");
        exit( EXIT_FAILURE );
    }

    shell = malloc(ARRAY_SIZE*sizeof(*shell));
    if( shell == NULL ) {
        fprintf(stderr, "Call to malloc() failed for 'shell'.\n");
        exit( EXIT_FAILURE );
    }


    /* Seed the PRNG */
    srand(time(NULL));


    /* Correct the bounds on the iteration */
    for(i=0; i<ARRAY_SIZE; i++) {
        inser[i] = shell[i] = rand() % RAND_CEILING;
    }


    /* Sort 'inser' */
    for(i=1; i<ARRAY_SIZE; i++) {
        j = i-1;
        while( inser[i] < inser[j] && j >= 0 ) {
            t = inser[i];
            inser[i] = inser[j];
            inser[j] = t;
            j--;                       /* WARNING: 'j' becomes -1 here */
            i--;
        }
    }


    /* Dump 'inser' to stdout */
    for(i=0; i<ARRAY_SIZE; i++) {
        printf("%d\t", inser[i]);
    }


    /* Cleanup */
    free(inser);
    free(shell);

    return EXIT_SUCCESS;
}

关于c - 找不到当前函数的界限,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22838955/

10-14 22:46