Прежде всего:
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;
}