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()吗