C 我的程序崩溃了,我没有';我不明白为什么连第一次打印都没有

C 我的程序崩溃了,我没有';我不明白为什么连第一次打印都没有,c,function,C,Function,我的程序应该对用户输入的数字列表进行排序,但它甚至在到达第一个printf之前就崩溃了。我的编译器发出2个警告,但我没有看到问题。我还没有研究指针,所以我不想使用它们。以下是信息: 在函数“选择\排序”中: [Warning] passing arg 2 of `selection_sort' makes pointer from integer without a cast 在函数“main”中: [Warning] passing arg 2 of `selection_sort' ma

我的程序应该对用户输入的数字列表进行排序,但它甚至在到达第一个printf之前就崩溃了。我的编译器发出2个警告,但我没有看到问题。我还没有研究指针,所以我不想使用它们。以下是信息:

在函数“选择\排序”中:

[Warning] passing arg 2 of `selection_sort' makes pointer from integer without a cast 
在函数“main”中:

[Warning] passing arg 2 of `selection_sort' makes pointer from integer without a cast 

#包括
整数选择\排序(整数n,整数v[n])
{
int高=v[0];
int i;
对于(i=0;i
您的程序正在使用可变长度数组,这是C99中添加的一项功能

但是,您可以根据未初始化的变量声明其大小。你认为那里会发生什么

在C语言中,函数中声明的变量没有设置为0。他们什么都不做。它们拾取堆栈上或寄存器中分配给它们的剩余值

我相信您的程序正在崩溃,因为
intv[n]
中的
n
是一个非常大的数字,并且
v
试图使用太多内存


您可能可以通过将数组声明移动到
scanf
下面来解决此问题,该函数读取
n
您需要将
v
而不是
v[n]
传递到函数选择排序
v
是数组,
v[n]
实际上是
v
的越界元素


该行应为
selection\u sort(n,v)

如果您看到
intv[n]
,你认为它是什么?继续@Gabe:注意,在这一点上,n没有值。@user3091996:你认为数组会有多大?
scanf
是一个高级主题,只适合有10年以上C语言使用经验的人使用。为什么教育者坚持在指针之前教它,这是掌握语言必须理解的基本概念。您对指针及其与数组的关系的误解与您的困惑直接相关。@user3091996:如果您刚开始使用C编程,所有警告都是错误的。你还不知道何时忽略警告。当然C语言中的首字母需要首先——但是你不能做一个函数,并调用它来初始化<代码> N< /Cord>?@博士:C99没有改变,使声明在任何地方工作,比如C++吗?如果没有,你仍然可以使用一个函数,或者你可以用{和}创建一个新块,并在新块的顶部声明它。@ZanLynx不知道-我可能应该练习一些C99@doctorlove:我也是。我使用C++或C89,因为微软从来没有更新到C99和GCC默认到C89.嗨!这很有帮助,但现在它在所有阵列的插槽上存储了最高的值。我会尝试修复它,如果我无法修复,我会回来。
#include<stdio.h>

int selection_sort(int n, int v[n])
{
    int high = v[0];
    int i;

    for(i = 0; i < n; i++)
        high = high < v[i]? v[i] : high;

    if(n - 1 == 0)
        return;

     v[n - 1] = high;
     n -= 1;

     selection_sort(n, v[n]);
}   



int main(void)
{   
    int n, i;
    int v[n];

    printf("Enter how many numbers are to be sorted: ");
    scanf("%d", &n);

    printf("Enter numbers to be sorted: ");
    for(i = 0; i < n; i++)
        scanf("%d", &v[i]);

    selection_sort(n, v[n]);

    printf("In crescent order: ");
    for(i = 0; i < n; i++)
        printf("%d ", v[i]);

    getch();
    return 0; 
}