Приступање елементима низа

Приступање елементима низа остварује се помоћу индекса елемената, чија се вредност налази у угластим заградама.

Напиши програм у програмском језику C којим се на стандардни излаз испиује вредност другог елемента низа arr дефинисаног у претходној лекцији.

#include <stdio.h>

int main(void)
{
    int arr[5] = { 10, 21, -13, 10, 0 };
    printf("%d", arr[1]);
    return 0;
}

На стандардном излазу исписаће се:

21

Напиши програм у програмском језику C којим се инкрементира, па на стандардни излаз исписује вредност другог елемента низа arr.

#include <stdio.h>

int main(void)
{
    int arr[5] = { 10, 21, -13, 10, 0 };
    arr[1]++;
    printf("%d", arr[1]);
    return 0;
}

На стандардном излазу исписаће се:

22

У пракси, често је неопходно да обезбедиш унос вредности елемената низа након покретања програма. То значи да не треба да извршиш иницијализацију низа у самом програму, већ да обезбедиш унос вредности елемената низа са стандардног улаза.

Напиши програм који са стандардног улаза у првој линији учитава број оцена \(n\), па у следећих \(n\) линија учитава оцене у низ o[]. Након тога, у једној линији стандардног излазa исписује све унете оцене. Нека ограничење \(0<n\le{20}\) представља \(n\) наставних предмета, укључујући владање, из којих ћеш бити оцењен на крају школске године.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
    int ocene[20], n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
        scanf("%d", &ocene[i]);
    for (int i = 0; i < n; i++)
        printf("%d ", ocene[i]);
    return 0;
}

У случају да корисник има 10 наставних предмета, извршавање програма у конзоли могло би да изгледа овако:

10
5
4
5
4
5
5
4
3
2
5
5 4 5 4 5 5 4 3 2 5

Излазак ван граница низа

Статички алоцираном низу меморија се додељује у време компајлирања, а величина низа је фиксна током извршавања програма. Када се низ креира, одређује се његов меморијски распоред, па његовим елементима можеш приступити преко њихових индекса унутар додељеног меморијског простора.

Међутим, могуће је приступити непостојећим елементима низа ван дефинисаних граница низа што резултира недефинисаним понашањем програма и непредвидивим резултатима. Приступ елементима ван граница низа доводи до читања или писања по меморијским локацијама које не припадају низу, потенцијално преписујући друге податке или изазивајући грешке у сегментацији меморије. Грешке у сегментацији могу довести до пада програма или до нетачних резултата.

На пример, следећи програм ће се компајлирати и извршити:

#include <stdio.h>

int main(void)
{
    int arr[5] = { 1, 2, 3, 4, 5 };
    printf("%d", arr[10]);
    return 0;
}

На стандардном излазу исписаће се:

-858993460

Јасно је да је иницијализован низ са пет елемената, а printf() функцијом на стандардни излаз исписује се вредност десетог елемента који не постоји. Као резултат извршавања програма на стандардни излаз исписаће се -858993460 (хексадекадно 0xCCCCCCCC) што значи да је програм приступио неиницијализованој меморијској локацији. Проблем је заправо још већи јер меморијска локација није само неиницијализована, него ни не припада низу arr.

Као што је већ написано, програм се компајлирао и извршио без грешака! Тек након извршења програма, у развојном окружењу Visual Studio појавила су се упозорења:

  • C6201: Index '10' is out of valid index range '0' to '4' for possibly stack allocated buffer 'arr'. и

  • C6385: Reading invalid data from 'arr'.

Поред датих упозорења, програм ће се поново компајлирати и извршити без грешака. То значи да, код статички алоцираних низова у програмском језику C, сâм програмер мора да брине о приступању елементима у оквиру дефинисаних граница низа.