2013-12-11 45 views
3

我的程序应该排列由用户输入的数字列表,但它在到达第一个printf之前崩溃。我的编译器发出2个警告,但我没有看到问题。我还没有学习过指针,所以我不想使用它们。下面是消息:我的程序崩溃了,我不明白为什么它甚至没有达到第一个printf

在功能`selection_sort ':

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

在函数'主':

[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; 
} 
+3

如果你看到'INT v [N];',你怎么看它? – Gabe

+1

@Gabe的后续行动:请注意,在那一点上,n没有任何价值。 –

+0

我认为它宣布了一个数组。这是错的吗? – user3091996

回答

2

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

行应该是selection_sort(n, v);

+0

嗨!这有所帮助,但现在它在所有阵列的插槽上存储最高价值。 – user3091996

+0

我会尝试修复它,如果我无法回复。 – user3091996

6

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

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

在C中,在函数内部声明的变量没有设置为0.它们没有设置为任何值。他们拿起堆栈或寄存器中剩下的任何值。

我相信你的程序崩溃了,因为nint v[n]是一个可笑的大数字而v正在尝试使用太多的内存。

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

+0

当然在C decallarations中不需要第一个 - 但是你不能创建一个函数并调用它来初始化'n'吗? – doctorlove

+0

@doctorlove:C99没有改变,使声明工作在任何地方,如C++呢?如果没有,你仍然可以通过使用函数来实现,或者你可以用{和}创建一个新块,并在新块的顶部声明它。 –

+0

@ZanLynx不知道 - 我应该练习一些C99 – doctorlove

相关问题