Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Динамическое распределение памяти




Общая форма объявления многомерного массива

Многомерные массивы

В языке Си массивы бывают не только одномерные, но и многомерные. Отличие состоит в том, что в одномерном массиве положение элемента определяется одним индексом, а в многомерном — несколькими.

тип имя массива [индекс 1]

[индекс 2]

[индекс п];

Элементы многомерного массива располагаются в последовательных ячейках оперативной памяти по возрастанию адресов. Между элементами нет разрывов. В памяти ЭВМ элементы располагаются построчно таким образом, что быстрее всего меняется последний индекс.

Пример расположения в памяти ЭВМ двухмерного массива int d[3] [4]

cf[0][0] cf[0][1] cf[0][2] cl[0][3] c/[1][0] cf[1][1] cf[1][2] cl[1][3] cf[2][0] cf[2][1] cf[2][2] cl[2][3]


Пример расположения в памяти ЭВМ трехмерного массива int d[2] [2] [2]

 

cf[0][0][0] cf[0][0][1]
cf[0][1][0] cf[0][1][1]
cf[1][0][0] cf[1][0][1]
cf[1][1][0] cf[1][1][1]

Применение двухмерных массивов. Двумерные массивы, как правило, отождествляются с матрицами, поэтому типовыми задачами, в которых применяются двухмерные массивы, являются задачи с матрицами: транспонирование матриц, вычисление определителя, определение средних значений матрицы и так далее.

Пример. Разработать программу вычисляющую сумму элементов по строкам и столбцам квадратной матрицы 3x3.

#include <stdio.h> #define i 3 #define j 3 main()

{

int data[i][j],s; int k, 1;

printf("\n Введите массив data \n");

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

{

printf("\n");

for (1 = 0; Kj; 1 + +)

{

printf("data[%d][%d] = ", k, 1);

scanf("%d", &data[k][1]); } }

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

{

s = 0;

for (l=0;l<j;l++) s=s+data[k][1];

printf("\пСумма элементов %d-n строки равна %d",

k+1, s); }


  for (1 = 0; Kj; 1 + +) r    
  i s=0; for (k=0; k<i; k++) s=s+data[k][1];    
  } printf("\пСумма %d столбца равна %d.", 1 + 1, s);
} ge ge tchar(); tchar();    

При программировании на языке Си может возникнуть ситуация, когда формально правильно написанная программа содержит некоторую серьёзную ошибку, которая может настолько повредить работе компьютера, что потребуется его перезагрузка. Поскольку программа написана формально верно, то компилятор ошибку не распознаёт. Рассмотрим пример подобной программы.

 

# include <std. LO. h>          
main () г              
  int *x, *w,y,z;          
  у=-15;              
  *х=16;              
  w= & у;              
  printf( "\n Размер указателя х составляет %d байт II 1
  sizeof( x)) r          
  printf( "\n Значение указателя х равно %и байт.", х);
  printf( "\n Значение по этому адресу равно %d.",* х);
  printf( "\n Адрес пе ременной у равен о U. •, &у);  
  printf( "\n Адрес пе ременной z равен о U. •, &z);  
} printf( "\n Значение *w равно - fed.", *w);    

Ошибка, содержащаяся в программе, одна из наиболее распространенных. По отдельности каждая строка программы правильна. Проблема заключается в не инициализированном указателе х. Объявление int *x приведёт к тому, что под переменную х выделется блок оперативной памяти. В нашем случае не выделен участок оперативной памяти для размещения числа 16. Получается, что 16 будет записано в неизвестную область памяти: поскольку переменная х не


инициализирована, то в ней хранится неизвестное число, и запись *х=\6 приводит к тому, что по неизвестному адресу расположится число 16. Это может привести к следующему: 1) стирание части кода операционной системы, 2) стирание части кода драйвера или другой программы, 3) стирание кода самой выполняемой программы. Компилятор такую ошибку распознать не сможет.

Исправить ситуацию можно, если использовать функцию динамического распределения памяти malloc, прототип которой хранится в головном файле alloc.h. Функция malloc выделит в оперативной памяти два байта, в которых можно разместить целое число 16, и адрес этих двух байтов гарантированно не совпадает ни с одним из адресов, используемых операционной системой.

Таким образом, в исходную программу необходимо добавить две строки: 1) директиву препроцессора Mnclude <alloc.h> и 2) непосредственно перед оператором *х=16; строку x=(int*)malloc(sizeojiini));.

#include <stdio.h> #include <alloc.h> main()

{

int *x,*w,y,z;

y=-15;

x=(int*) malloc(sizeof(int));

*x=16;

w= & у;

printf("\n Размер указателя х составляет %d байт.", sizeof(x));

printf("\n Значение указателя х равно %u байт.", х); printf("\n Значение по этому адресу равно %d.",*x); printf("\n Адрес переменной у равен %u.", &y); printf("\n Адрес переменной z равен %u.", &z); printf("\n Значение *w равно %d.", *w); }

Описание функции malloc. Функция malloc динамически распределяет блок памями размером size байт. Возвращаемое значение — указатель на выделенную область памяти.

#include <alloc.h> void *malloc(size); unsigned size;





Поделиться с друзьями:


Дата добавления: 2014-11-29; Просмотров: 412; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.009 сек.