Не удалось найти причину ошибки в коде - PullRequest
0 голосов
/ 16 марта 2019

Это программа для печати наименьшего значения и его позиции в массиве (определяется пользователем).

#include <stdio.h>
int position_smallest(int a[],int n)
{
    int smallest = a[0];
    int i,k;
    for(i=0; i<=n-1; i=i+1)
    {
        if(a[i]<a[0])
        {
            smallest = a[i];
            k = i;
        }
    }
    printf("The smallest value is %d\n", smallest);
    printf("It's position is %d\n", k); 
    return 0;
 }

int main()
{
    int n,j;
    int a[n];
    printf("Enter the size of the array: ");
    scanf("%d", &n);
    for(j=0; j<=n; j=j+1)
    {
         printf("a[%d] = ", j);
         scanf("%d", &a[j]);
    }
    position_smallest(a,n); 
} 

Но при запуске оно выдает следующую ошибку:

Segmentation fault (core dumped)

Какая может быть причина (ы) для этого?

Ответы [ 3 ]

2 голосов
/ 16 марта 2019

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

Вторая ошибка - это цикл в вашей основной функции, который идет от 0 до n, то есть индекс массива выходит за пределы.

Попробуйте это:

int main() {
    int n = 0, j = 0;
    printf("Enter the size of the array: ");
    scanf("%d", &n);

    int a[n];

    for (j = 0; j < n; j++) {
        printf("a[%d] = ", j + 1);
        scanf("%d", &a[j]);
    }
    position_smallest(a,n);
} 

Если это решило вашу проблему, отметьте это.

1 голос
/ 16 марта 2019

Используйте это:

#include <stdio.h>

int position_smallest(int a[],int n)
{
    int smallest = a[0];
    int i,k;
    for(i=0; i<=n-1; i=i+1)
    {
        if(a[i]<a[0])
        {
            smallest = a[i];
            k = i;
        }
    }
    printf("The smallest value is %d\n", smallest);
    printf("It's position is %d\n", k); 
    return 0;
}

int main()
{
    int n,j;
    int a[100];
    printf("Enter the size of the array: ");
    scanf("%d", &n);
    for(j=0; j<n; j=j+1)
    {
        printf("a[%d] = ", j);
        scanf("%d", &a[j]);
    }
    position_smallest(a,n); 
} 

Укажите любой размер массива, кроме цикла, в соответствии с пользовательским вводом.

И есть некоторые проблемы в вашей функции position_smallest. Поэтому, если вы хотите исправить это, взгляните на ответ @ Gox.

1 голос
/ 16 марта 2019

Прежде всего:

int n, j;

оба неинициализированы. Инициализируйте их, иначе вы получите значения мусора.

int n = 0, j = 0;

Что произойдет, если n случайно (очень вероятно) будет 0 в следующей строке?

int a[n];

Вы выделяете 0 байтов для массива a[]. Затем вы вводите 10 в следующей строке

scanf("%d", &n);

Вы получите segmentation fault в цикле for() ниже, потому что ваш цикл пытается поместить 10 элементов туда, где вы вообще не выделяли память.

Что произойдет, если неинициализированный n случайно (очень вероятно) имеет размер 2 ^ 32 * 4 байта (int с макс.)?

int a[n];

Вы выделяете 2 ^ 32 байта для массива a[]. Затем вы вводите 10 в следующей строке

scanf("%d", &n);

Вы не получите segmentation fault, но вы выделите 2 ^ 32 * 4 байта памяти для вашей программы, и вы будете использовать только 10

Второе, если этого недостаточно:

for (j = 0; j <= n; ++j)
    scanf("%d", arr[n];

получит доступ к 11th элементу массива, поведение которого не определено, и вы можете даже получить segmentation fault там. Как вы знаете, массивы в C индексируются с 0 до n - 1 (если n - размер массива).

Третий цикл внутри функции:

for(i=0; i<=n-1; i=i+1)

совпадает с:

for(i=0; i < n; ++i)

И, наконец, в вашем коде есть ошибка, я считаю:

if(a[i]<a[0])

должно быть:

if (a[i] < smallest)

потому что, скорее всего, вы хотите сравнить другое число с уже наименьшим элементом, а не с a[0]. Вот мой код

#include <stdio.h>

int position_smallest(int a[],int n) {
    int smallest = a[0];
    int i = 0, k=0;
    for(i=0; i<n; ++i) {
        if(a[i]<smallest) {
            smallest = a[i];
            k = i;
        }
    }
    printf("The smallest value is %d\n", smallest);
    printf("It's position is %d\n", k);
    return 0;
}

int main() {
    int n=0, j=0;
    printf("Enter the size of the array: ");
    scanf("%d", &n);                                                                                                                                                                                                                     
    int a[n];

    for(j=0; j<n; ++j) {
        printf("a[%d] = ", j);
        scanf("%d", &a[j]);
    }
    position_smallest(a,n);

    return 0;
}

Версия выше действительна для C99 и выше стандартов. Если вы используете C89 и более ранние компиляторы, у вас стек с фиксированным размером, как указано в ответе @ Saurabh, или предпочтительно используйте malloc().

Вот malloc() версия:

#include <stdio.h>
#include <stdlib.h>

int position_smallest(int a[],int n) {
    int smallest = a[0];
    int i=0,k=0;
    for(i=0; i<=n-1; i=i+1) {
        if(a[i]<smallest) {
            smallest = a[i];
            k = i;
        }
    }
    printf("The smallest value is %d\n", smallest);
    printf("It's position is %d\n", k);
    return 0;
}

int main() {
    int n=0, j=0;
    printf("Enter the size of the array: ");
    scanf("%d", &n);
    int *a = malloc(sizeof(int) * n);

    for(j=0; j<n; j=j+1) {
        printf("a[%d] = ", j);
        scanf("%d", &a[j]);                                                                                                                                                              
    }
    position_smallest(a,n);

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...