gpt4 book ai didi

C中的计数排序段错误

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

下面是我对计数排序的尝试。我绘制了我的逻辑图,口​​头贯穿了它,并对我的代码进行了彻底的评论。但是,我的代码导致了段错误。我知道段错误表示对内存的非法访问,所以这一定意味着我的索引值之一正在尝试访问数组范围之外的索引。但是,我不明白为什么会这样。

幸运的是,我的调试器突出显示了下面这行,我在评论中也注意到了,这是发生段错误的地方。尽管如此,我完全被难住了。如果您能帮助理解此段错误的性质,我们将不胜感激,谢谢。

void sort(int values[], int n)
{

//create array of finite size (65536)
int countArray[INT_MAX];

//create array to eventually store sorted values
int sortedValues[n];

//loop through unsorted values to increment countArray index for each occurrence
for(int i = 0; i < n; i++) {
countArray[ values[i] ] += 1;
}


//starting index for sortedValues[]
int sortedIndex = 0;

//loop until we've reached the end of sortedValues[]
while(sortedIndex < n) {

//loop through each index value of countArray
//j represents the value
for(int j = 0; j < INT_MAX; j++) {

//how many times does the index of countArray occur in values[]?
int c = countArray[j];

//only add index j as a value to sortedValues[] if it appears in values[]
while(c > 0) {

//append j to sortedValues[]
//--SEGMENTATION FAULT OCCURS ON THE LINE BELOW--
sortedValues[sortedIndex] = j;

//decrease the count of countArray[j] once value appended to sortedValues[]
c -= 1;

//move to next index of sortedValues[]
sortedIndex += 1;
}
}
}
return;
}

最佳答案

你需要初始化countArray元素归零以修复崩溃:

int countArray[INT_MAX] = {0};

但是,您的函数仍然无用,因为它将排序后的数字放入一个本地数组中,该数组永远不会超出函数范围。为了解决这个问题,删除 sortedValues数组,并使用原来的 values改为输出数组:

values[sortedIndex] = j;

现在调用者将看到他传递给您的函数的数组返回排序。

注意:外循环while(sortedIndex < n)无害但无用,因为 for循环保证 sortedIndex正是n .您应该删除 while从你的代码循环。

关于C中的计数排序段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43773283/

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