我的程序崩溃,我不明白为什么它甚至没有到达第一个printf

时间:2013-12-11 16:51:10

标签: c function

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

在函数`selection_sort'中:

[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 

#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; 
}

2 个答案:

答案 0 :(得分:6)

您的程序使用的是可变长度数组,这是C99中添加的一项功能。

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

在C中,在函数内声明的变量不设置为0.它们不设置为任何值。它们可以获取堆栈中或分配给它们的寄存器中的任何值。

我认为您的程序崩溃了,因为n中的int v[n]是一个非常大的数字而v正在尝试使用太多内存。

您可以通过将数组声明移到scanf读取的n下方来解决此问题。

答案 1 :(得分:2)

您需要将v而不是v[n]传递给函数selection_sort。 v是数组,v[n]实际上是v的超出边界元素。

该行应为selection_sort(n, v);