2015-03-21 6 views
1

Я получаю ошибку сегментации при попытке сделать эту простую программу сортировки c Я новичок на языке C. И можете ли вы объяснить мне, почему я получаю ошибку сегментацииОшибка сегментации в c-программе

#include<stdio.h> 

int main(void) 
{ 
    int prev,next,result,total_number; 
    int i,j=1,b; 
    int a[i]; 

    printf("Number of values to be entered"); 
    scanf("%d",total_number); 
    printf(" enter the values \n"); 
    for(i=0;i<=total_number-1;i++) 
    { 
     printf(" enter the values \n"); 
     scanf("%d",a[i]); 
    } 
    for(i=0;i<=total_number-2;i++) 
    { 
     for(j=1;j<=total_number-1;j++) 
     { 
      if(a[i]>a[j]) 
      { 
       b=a[i]; 
       a[i]=a[j]; 
       a[j]=b; 
      } 
      else 
      { 
       break; 
      } 
     } 
    } 
    for(i=0;i<total_number-1;i++) 
    { 
     printf("The numbers are %d",a[i]); 
    } 

} 
+0

Вы пробовали отладку? Простейшая процедура заключается в том, чтобы передать строки и запустить, чтобы увидеть, есть ли ошибка. Кстати, ошибка в использовании 'scanf()' например. 'ЗсапЕ ("% d", TOTAL_NUMBER);' –

ответ

3

Неисправность сегментации вызвана этой линии:

scanf("%d",total_number); 

Вы упускаете адрес (&) оператора, это должно быть так:

scanf("%d",&total_number); 

Оператор также отсутствует в этой строке:

scanf("%d",a[i]); 

Вы можете найти более подробную информацию о зсапЕ в glibc manual:

Другой областью разницы между зсапЕ и Printf является то, что вы должны помнить, чтобы поставить указатели, а не непосредственные значения как необязательные аргументы Scanf; считываемые значения сохраняются в объектах, на которые указывают указатели. Даже опытные программисты, как правило, иногда забывают об этом, поэтому, если ваша программа получает странные ошибки, которые, как представляется, связаны с scanf, возможно, вам стоит дважды проверить это.

Но есть и другие тонкие ошибки в вашем коде: факт, что int i в массиве [i] не инициализирован, приводит к неопределенному поведению, то есть что-то может произойти. Вы можете использовать таНос выделить место для массива, а просто изменение порядка может быть достаточно:

scanf("%d",&total_number); 
int a[total_number]; 

использует пользовательский ввод выделить массив.

Наконец, кажется, что вы пытаетесь реализовать алгоритм вставки сортировки, но логика несколько недостатков: даже исправление ошибок в коде на вход

1 3 5 0 

получает «предписывалось»

1 5 3 0 

Но я не знаю, что вы пытались реализовать. Если вы действительно пытались внедрить сортировку вставки, вы можете использовать pseucode из wiki-статьи insertion sort, чтобы получить представление о том, чего не хватает в вашей реализации.

2

int a[i]; создает массив произвольного размера, так как я не инициализирован.

Вместо этого вы можете динамически создавать эквивалент массива int, как только вы знаете total_number.

int* a; 

. . . snip . . . 

/* once you know total_number */ 

a = (int*) malloc(total_number, sizeof(int)); 

/* you can use a with array notation as long as you stay in bounds */ 

a[i] = something; 

/* don't forget to free a when you are done */ 

free(a); 
Смежные вопросы