Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 找不到当前函数的边界_C_Debugging_Bounds - Fatal编程技术网

C 找不到当前函数的边界

C 找不到当前函数的边界,c,debugging,bounds,C,Debugging,Bounds,我正在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(

我正在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;
}
int main(无效){
int i,t,j;
int*inser=malloc(sizeof(int)*16384);
int*shell=malloc(sizeof(int)*16384);
srand(时间(空));

对于(i=0;i只需在堆栈上分配缓冲区

int inser[16384];
int shell[16384];
堆是邪恶的儿子。

更改3个
for()
循环终止。正如@Joachim Pileborg和@BLUEPIXY指出的那样,
for()
循环执行得太频繁了

for (i = 0; i < 16384; i++) {
... 
for (i = 1; i < 16384; i++) {
...
for (i = 0; i < 16384; i++) {
(i=0;i<16384;i++)的
{
... 
对于(i=1;i<16384;i++){
...
对于(i=0;i<16384;i++){
避免赤裸裸的魔法数字

#define ASIZE (16384)
int *inser = malloc(ASIZE * sizeof(int));
...
for (i = 0; i < ASIZE; i++) {
#定义ASIZE(16384)
int*inser=malloc(ASIZE*sizeof(int));
...
对于(i=0;i

请参阅@Emmet answer,了解
-1
关注点的索引。

您的第一个for循环将运行16385次,因为它将针对(包括)之间的每个数字运行一次0和16384。由于您的数组有16384个元素,您将使其溢出。这就是Joachim和BLUEPIXY的目的。解释了导致gdb错误的原因。

除了其他人指出的循环边界错误外,请查看下面标记为“警告”的行(我还清理了您的代码,使其更具可读性)。在此行中,当
j
开始为零时,
j
变为-1。然后在此使用此值:

while( inser[i] < inser[j] && j >= 0 ) { ... }
除此之外,我不能说您的(已更正的)代码是否会按预期运行

打开所有编译器警告,您可能会发现一些错误

#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;
}
#包括
#包括
/*避免使用幻数*/
#定义数组大小(16384)
#定义RAND_天花板(17000)
内部主(空){
int i;/*索引和迭代变量*/
int j;/*索引和迭代变量。*/
int t;/*用于交换的临时变量*/
int*inser;/*排序数组*/
int*shell;/*原始数组*/
/*始终检查malloc()的返回值*/
inser=malloc(数组大小*sizeof(*inser));
if(inser==NULL){
fprintf(stderr,“为'inser'调用malloc()失败”。\n”);
退出(退出失败);
}
外壳=malloc(数组大小*大小(*外壳));
if(shell==NULL){
fprintf(stderr,“对'shell'调用malloc()失败”。\n”);
退出(退出失败);
}
/*种子PRNG*/
srand(时间(空));
/*更正迭代的边界*/

对于(i=0;i确保调试器和编译器可执行文件的路径指向相同的MingW构建

一点说明:


我遇到了相同的错误。我已经在我的windows上安装了MingW软件包。正如你所知,代码块在某些软件包中也附带了MingW。因此,我在我的windows中有两个MingW。但是,我注意到了编译器安装目录的路径(在设置/compiler/Toolchain Executables/中)被设置为不同的一个和调试器(在设置/debugger/Default->可执行路径中)设置为不同的MingW版本。我将它们更改为我在显式使用代码块之前安装的相同版本。现在,它工作正常。可能有很多原因导致erorr/bug。它对我有效,我希望它也能帮助其他人…

您分配的内存可以用作数组,并具有类似数组的索引功能(例如
inser[I]
而不是
*(插入+i)
)。当您这样做时,您可能会意识到您的循环将越界。
i
i当我使用大小为16384的数组索引时,程序开始冻结很多,即使在调试期间也是如此。这就是为什么我决定使用消除冻结的堆。您的堆栈空间可能不够大,请使用堆。没有什么坏处关于堆。如果他有4字节
int
s(可能是真的),那就是128KiB的堆栈,而他可能没有(我的shell中默认的堆栈大小是8KiB)
在这里是正确的选择。如果他想避免赤裸裸的魔法数字,他也应该在
for
循环边界中避免它们。@Emmet同意,这就是为什么我在
for(I=0;IASIZE
){
。对不起,@chux,我弄错了。我读了第一节,以为你是在推荐它,因为你已经纠正了循环边界。
j=-1
。可以做
j=I;而(j-->0&&inser[I]
并对
i,j
使用
size\u t
,因为它们是数组索引,所以对它们更有意义。
#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;
}