gpt4 book ai didi

找不到当前函数的边界

转载 作者:太空宇宙 更新时间:2023-11-04 03:48:02 25 4
gpt4 key购买 nike

我正在 C 上对 16384 数组实现插入排序。

排序算法运行正常,但是当遇到 free(inser) 命令时,调试器输出 Cannot find bounds of current function 错误。

这会不会是因为我在 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;
}

最佳答案

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

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

逻辑“与”,&&,是一个快捷运算符:它的左侧(LHS)总是被评估,而右侧只有在 LHS 评估为“真的”。因此 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;
}

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com