LINUX.ORG.RU

const int array[]


0

0

Извините за дурацкие вопросы, только начинаю C =)

Такая программа:

//03.05.04
#include <stdio.h>

void modify( const int [] );

main()
{
        int array[] = { 10, 20, 30 };
        modify(array);
        printf( "%d\n", array[0] );
}

void modify( const int array[] )
{
        ++array[0]; //Should be an error!
}

Два вопроса:

- в моей книжке по C сказано, что если объявлять массивы как const, 
их нельзя будет изменять, и вообще будет ошибка компиляции, и 
приводится пример из борланд с компилера. Но у меня в gcc... Все 
работает! Хотя при компиляции выводится предупреждение 


testing_arrays.2.c: In function `modify':
testing_arrays.2.c:14: warning: assignment of read-only location

Программа выводит "11", хотя должна быть либо ошибка, либо "10", ведь
 массив константен! Что не так?

- вообще, правильно лия пишу код? Отступы там, всякие мелочи... Может
 что не совсем правильно, дайте совет?
anonymous

Ответ на: комментарий от df_0903

gcc 3.3.3 номано скомпилил , только ворнинг выдал

Deleted
()

Я думаю так: const int array[] - Это то же что и const int *array.

То есть константный укзатель. Когда ты делаешь ++array[0] то изменяешь не сам указатель, а данные на которые он указывает. А данные у тебя вовсе не в секции "read_only".

Думаю ошибка будет если ты изначально обьявишь массив как const, то есть в ф-ции main. Тогда он весь будет "константым".

OxiD ★★★★
()

>- вообще, правильно лия пишу код? Отступы там, всякие мелочи... Может > что не совсем правильно, дайте совет?

Обычно не передают массив в подпрограмму. Это делают через указатели. И работают с ними тоже через указатели. Почитай про это у Кернигана и Ритчи, там подробно написано.

OxiD ★★★★
()

test2.c: In function `modify':
test2.c:14: error: increment of read-only location

gcc version 3.3.3

anonymous
()
Ответ на: комментарий от OxiD

> Это то же что и const int *array.

> То есть константный укзатель.

Это указатель _на_ константу. Указатель-константа записывается как

int *const array;

anonymous
()
Ответ на: комментарий от OxiD

void modify( const int array[] ) от void modify( const int *array ) ничем не отличается. Никакого копирования массива. Это указатель. Прочитай книжку сам и посмотри, что выводит программа.

anonymous
()
Ответ на: комментарий от anonymous

А кто говорил что что-то куда-то копируется? Про копирование массива речи не было. Прочитай мой пост еще раз.

OxiD ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.