C中计数排序的奇怪输出
我有以下计数排序功能C中计数排序的奇怪输出,c,C,我有以下计数排序功能 /* *File: countingSort.c *Description: A counting sort subroutine. Takes as input an array of integers. * an array length and a range. All values in the input array must fall within [0, range]. *
/*
*File: countingSort.c
*Description: A counting sort subroutine. Takes as input an array of integers.
* an array length and a range. All values in the input array must fall within [0, range].
* Takes O(range + arrayLen) time and O(range + arrayLen) extra space
*
*/
#include "countingSort.h"
int* countingSort(int unsorted[], int arrayLen, int range) {
int store[range + 1];
int sorted[arrayLen];
for ( int i = 0; i <= range; i++ ) {
store[i] = 0;
}
for ( int i = 0; i < arrayLen; i++ ) {
sorted[i] = 0;
}
for ( int j = 0; j < arrayLen; j++ ) {
store[unsorted[j]] ++;
}
for ( int i = 1; i <= range; i++ ) {
store[i] += store[i-1];
}
for( int j = arrayLen - 1; j >= 0; j-- ) {
sorted[store[unsorted[j]]] = unsorted[j];
store[unsorted[j]] --;
}
return sorted;
}
/*
*文件:countingSort.c
*描述:一个计数排序子程序。将整数数组作为输入。
*数组长度和范围。输入数组中的所有值必须在[0,范围]内。
*需要O(范围+阵列)时间和O(范围+阵列)额外空间
*
*/
#包括“countingSort.h”
整数*计数排序(整数未排序[],整数数组,整数范围){
整数存储[范围+1];
整数排序[arrayLen];
对于(int i=0;i您正在返回一个局部数组变量。当函数退出时,该变量将被销毁,使得访问该变量的地址不再安全或有效。事实上,访问该变量将产生所谓的未定义行为,这解释了为什么它有时看起来“有效”
这是C中一个典型的初学者错误。您必须让调用者传入所需的目标数组,或者使用malloc()
分配“持久”堆内存并返回:
int* countingSort(int unsorted[], int arrayLen, int range) {
int *sorted = malloc(arrayLen * sizeof *sorted );
if (sorted== NULL)
return NULL;
/* rest of sorting */
return sorted;
}
arrayLen*sizeof*sorted
表达式计算分配所需的字节数。无需使用calloc()
这将清除内存;您将覆盖每个元素,因此清除它只是白费力气。您将返回一个本地数组变量。当函数退出时,该变量将被销毁,使访问该变量的地址不再安全或有效。事实上,访问它将产生所谓的未定义行为,即莱恩解释了为什么它有时看起来“有效”
这是C中一个典型的初学者错误。您必须让调用者传入所需的目标数组,或者使用malloc()
分配“持久”堆内存并返回:
int* countingSort(int unsorted[], int arrayLen, int range) {
int *sorted = malloc(arrayLen * sizeof *sorted );
if (sorted== NULL)
return NULL;
/* rest of sorting */
return sorted;
}
arrayLen*sizeof*sorted
表达式计算分配所需的字节数。无需使用calloc()
这将清除内存;您将覆盖每个元素,因此清除它只是白费力气。您将返回一个本地数组变量。当函数退出时,该变量将被销毁,使访问该变量的地址不再安全或有效。事实上,访问它将产生所谓的未定义行为,即莱恩解释了为什么它有时看起来“有效”
这是C中一个典型的初学者错误。您必须让调用者传入所需的目标数组,或者使用malloc()
分配“持久”堆内存并返回:
int* countingSort(int unsorted[], int arrayLen, int range) {
int *sorted = malloc(arrayLen * sizeof *sorted );
if (sorted== NULL)
return NULL;
/* rest of sorting */
return sorted;
}
arrayLen*sizeof*sorted
表达式计算分配所需的字节数。无需使用calloc()
这将清除内存;您将覆盖每个元素,因此清除它只是白费力气。您将返回一个本地数组变量。当函数退出时,该变量将被销毁,使访问该变量的地址不再安全或有效。事实上,访问它将产生所谓的未定义行为,即莱恩解释了为什么它有时看起来“有效”
这是C中一个典型的初学者错误。您必须让调用者传入所需的目标数组,或者使用malloc()
分配“持久”堆内存并返回:
int* countingSort(int unsorted[], int arrayLen, int range) {
int *sorted = malloc(arrayLen * sizeof *sorted );
if (sorted== NULL)
return NULL;
/* rest of sorting */
return sorted;
}
arrayLen*sizeof*sorted
表达式计算分配所需的字节数。无需使用calloc()
来清除内存;您将覆盖每个元素,因此清除它只是白费力气。我应该使用alloc()/calloc()吗对于第页似乎建议的数组,我应该按照第页似乎建议的数组使用alloc()/calloc()吗?对于第页似乎建议的数组,我应该按照第页似乎建议的数组使用alloc()/calloc()吗