2016-02-07 3 views
-2

Я писал программу, которая принимает информацию о студентах через массив структуры, а затем выполняет различные операции над ним.Нарушение прав доступа 0xc00005 в C

Всякий раз, когда я пытаюсь выполнить любую из двух операций i.e 1 и 2, я получаю нарушение доступа.

Вот код.

#include <stdio.h> 
void linear(); 
void bubble(); 
void binary(); 
void insertion(); 

int i, j, temp; 

struct kaksha{ 
    int RegNo; 
    char Name[50]; 
    char Branch[50]; 
    float GradePoint; 
}; 

int main() 
{ 
    int size, choice; 
    struct kaksha *ptr; 

    ptr = (struct kaksha *)malloc(sizeof(struct kaksha)); //Allocate memory to the structure. 
    struct kaksha jwak[50]; 
    printf("Enter the number of students.\n"); 
    scanf("%d", &size); 
    printf("Enter the respective details.\n"); 
    printf("   \n"); 
    for (i = 1 ; i < size + 1; i++) 
    { 
     printf("Enter registration number for student number %d.\n", i); 
     scanf("%d", &jwak[i].RegNo); 
     printf("Enter CGPA for student number %d.\n", i); 
     scanf("%f", &jwak[i].GradePoint); 
     printf("Enter name for student number %d.\n", i); 
     scanf("%s", &jwak[i].Name); 
     //gets(jwak[i].Name); 
     printf("Enter branch of student number %d.\n", i); 
     scanf("%s", &jwak[i].Branch); 
     //gets(jwak[i].Branch); 
    } 
    printf("Select the operation to be formed.\n"); 
    printf("1. Call linear search function to display data of student with a particular registration number.\n"); 
    printf("2. Call bubble sort function to arrange data of students according to registration number.\n"); 
    printf("3. Apply binary search on the output of option 2 to display data of a student with a particular registration number.\n"); 
    printf("4. Use and modify Insertion sort logic to arrange data of students in descending order of CGPA.\n"); 
    scanf("%d",choice); 

    switch(choice) 
    { 
    case 1: 
     linear(jwak,size); 
    case 2: 
     bubble(jwak,size); 
    case 3: 
     binary(jwak,size); 
    case 4: 
     insertion(jwak,size); 
    } 
} 

void linear(struct kaksha jwak[],int size) 
{ 
    int query; 
    printf("Enter the register number of the student you wish to query.\n"); 
    scanf("%d", &query); 
    for (i = 0 ; i < size ; i++) 
    { 
     if (jwak[i].RegNo == query) 
     { 
      printf("Name of the student is %s.\n",jwak[i].Name); 
      printf("Branch of the student is %d.\n",jwak[i].Branch); 
      printf("Grade point of the student is %f.\n",jwak[i].GradePoint); 
     } 
     else 
     { 
      printf("Corresponding entry does not exist.\n"); 
     } 
    } 
} 

void bubble(struct kaksha jwak[],int size) 
{ 
    for (i = 0 ; i < size ; i++) 
    { 
     for (j = 0 ; j < (size - i - 1) ; j++) 
     { 
      if (jwak[j].RegNo > jwak[j + 1].RegNo) 
      { 
       temp = jwak[j].RegNo; 
       jwak[j].RegNo = jwak[j + 1].RegNo; 
       jwak[j + 1].RegNo = temp; 
      } 
     } 
    } 

    printf("Data arranged according to increasing order of registration  number.\n"); 
    for (i = 0 ; i < size ; i++) 
    { 
     printf("Registration number of the student is %d.\n", jwak[i].RegNo); 
     printf("Name of the student is %s.\n", jwak[i].Name); 
     printf("Branch of the student is %d.\n", jwak[i].Branch); 
     printf("Grade point of the student is %f.\n", jwak[i].GradePoint); 
    } 
} 
+0

сделать ваш код доступным для чтения, так что легче сказать, в чем проблема. Используйте отладчик, чтобы узнать, где эта проблема. –

+2

Не отбрасывайте возврат malloc в C. Кроме того, включите , чтобы соответствующий прототип присутствовал для malloc. –

+0

Пожалуйста, не просто отправляйте свой вопрос, когда вы не получили ответ в первый раз. – fuz

ответ

0

David уже указал problem with strings. Вторая проблема здесь:

scanf("%d",choice); 

Вы забыли &:

scanf("%d", &choice); 

Подсказка: если вы использовали отладчик, вы бы сразу нашли линию, и я уверен, что вы бы открыл опечатку самостоятельно.

+0

Да, я использовал отладчик и нашел источник. Спасибо, в любом случае, хороший сэр. – cenobia

-1

Я вижу несколько importatnt вопросы

  1. Вы никогда не проверяют size ли менее 50 что размер вашего массива.
  2. Вы начинаете цикл на i == 1 и заканчиваете его на i < size + 1. В массивы индексируются от 0 к size - 1 поэтому она должна быть

    for (int i = 0 ; i < size ; ++i) 
    
  3. При вызове scanf() с "%s" спецификатора вы не должны передавать адрес массива, массив автоматически преобразуется в указатель на его первый элемент адрес &array и array то же самое, но &array + 1 и array + 1 не совпадают. (Read this answer for more of this)

  4. В вашем switch заявлении нет никакого перерыва, поэтому все случаи провалиться, и это означает, что если пользователь выбрать 1, например, 1, 2, 3, 4 ... и так далее будет казнены.

  5. Как уже упоминалось in this answer не включая stdlib.h прототип malloc() является неправильным, который приведет к непредсказуемому поведению. Компилятор должен говорить вам "предупреждение: неявная декларация функции встроено malloc() вы можете быть пренебрегая это, но вы не должны

  6. Вы всегда игнорировать возвращаемое значение scanf(), и это может привести к непредсказуемому поведению..

+0

Я сделал это намеренно, чтобы номер студента в printf начинается с 1, а не 0. – cenobia

+0

Но это неправильно, вы используете 'i' в качестве индекса и в своем коде вы потенциально получаете доступ к одному элементу после последнего, просто добавьте 1 к номеру студента, вы? Кроме того, после исправления стиля кода я нашел больше проблем. –

+0

Вы правы. Спасибо. – cenobia

1

При вызове scanf для строки, вы не передать адрес.

scanf("%s",&jwak[i].Name); 

Вы делаете это несколько раз. Вам нужно сделать это для целых чисел, поплавков и т. Д., Но помните, что в C вы используете массив байтов, который уже уже (эффективно) указатель. Таким образом:

scanf("%s",jwak[i].Name); 

Это почти наверняка является источником нарушений доступа.

Кроме того, как я уже упомянул в комментариях, при использовании malloc в C не выдавайте возвращаемое значение. Кроме того, включите <stdlib.h>, чтобы у вас был подходящий прототип для malloc.

+0

Удалены амперсанды, все еще имеющие нарушения доступа. – cenobia

Смежные вопросы