我的C程序操作已停止

我的C程序操作已停止,c,C,我编写并运行这段代码来练习基本算法。但此程序操作已停止。有什么问题 #include <stdio.h> #include <stdlib.h> int bans(const void *a, const void *b) { return (*(int *)a - *(int *)b); } int main() { int m, i; int* arr; scanf("%d", &m); arr = (int*)

我编写并运行这段代码来练习基本算法。但此程序操作已停止。有什么问题

#include <stdio.h>
#include <stdlib.h>

int bans(const void *a, const void *b) {
    return (*(int *)a - *(int *)b);
}

int main() 
{ 
    int m, i;
    int* arr;
    scanf("%d", &m);
    arr = (int*)malloc(sizeof(int) * m);
    for (i = 0; i < m; i++) {
        scanf("%d", arr[i]);
    }
    int n = sizeof(arr)/sizeof(arr[0]);
    for (i = 0; i < n; i++) printf("%d ", arr[i]);
    qsort(arr, n, sizeof(arr[0]), bans);
    for (i = 0; i < n; i++) printf("%d ", arr[i]);
    free(arr);
    return 0;
}
#包括
#包括
int bans(常数无效*a,常数无效*b){
返回(*(int*)a-*(int*)b);
}
int main()
{ 
int m,i;
int*arr;
scanf(“%d”、&m);
arr=(int*)malloc(sizeof(int)*m);
对于(i=0;i
  • scanf
    需要指向
    arr[i]
    的指针:
    arr+i
    就足够了

  • sizeof(arr)
    实际上是
    sizeof(int*)
    。使用
    m
    表示元素的数量。您正在使用的习惯用法仅适用于数组类型,而不是指针类型


  • 主要的问题在声明中

      scanf("%d", arr[i]);
    
    其中,
    arr[i]
    的类型为
    int
    。您需要传递一个指向type(
    int
    )的指针,如

    scanf("%d", &arr[i]);
    

    启用最高级别的编译器警告,编译器应警告您预期的类型不匹配

    之后呢,在这个案例中,

      int n = sizeof(arr)/sizeof(arr[0]);
    
    错误,因为
    sizeof(arr)
    sizeof(int*)
    相同。你根本不需要一个新的变量。使用
    m

    scanf(“%d”,arr[i])-->
    scanf(“%d”和&arr[i])
    scanf(“%d”,arr+i),使用
    m
    代替
    n
    。请阅读Eric Lippert的文章。
      int n = sizeof(arr)/sizeof(arr[0]);