C: Не проверяет размер массива.
От: k55 Ниоткуда  
Дата: 24.03.15 15:47
Оценка: :)))
Подскажите пожалуйста это так и должно быть что C компилятор не проверяет размер передаваемого массива в функцию? (Я ожидал обратное)

int Myfunc(int (*MacArray)[6])
{
  int i =0;
  for(i = 0; i < 6; ++i )
    (*MacArray)[i] = i;
  return 0;
}
 
int main(void) {
  int array[6];   /*<---- Если тут указать другое число, что компилятор скушает и ничего не скажет*/
  Myfunc(&array);
  int i =0;
  for(i = 0; i < 6; ++i )
    printf("%d \n", array[i]);
  return 0;
}


Code on Ideone
Если есть желание — найдется 1000 возможностей.
Если нет желания — найдется 1000 причин.
Re: VS bug: new int(1,2,"wtf")
От: Constructor  
Дата: 25.03.15 19:17
Оценка: 2 (1) +1
Здравствуйте, k55, Вы писали:

k55>Подскажите пожалуйста это так и должно быть что C компилятор не проверяет размер передаваемого массива в функцию? (Я ожидал обратное)


Прежде чем делать задавать такие вопросы, стоит проверить компилируемость кода на нескольких компиляторах, не забыв выкрутить на максимум предупреждения (превратив их заодно в ошибки) и задав режим по возможности наиболее точного следования стандарту. При несовпадении результатов можно обратиться и к самим скрижалям.

В данном случае имеем:

gcc 4.8.2 с ключами -Wall -Wextra -Werror -pedantic-errors -std=c99 выдает ошибку компиляции.

clang 3.4 с ключами -Wall -Wextra -Werror -pedantic-errors -std=c99 выдает ошибку компиляции.

vc 18.00.21005.1 (из Visual Studio 2013 RTM) с ключами /Wall /WX /Za выдает ошибку компиляции.

k55>Code on Ideone


На ideone.com нет возможности задавать ключи клмпиляции, поэтому им лучше не пользоваться.
Re: C: Не проверяет размер массива.
От: Vamp Россия  
Дата: 24.03.15 16:20
Оценка: 2 (1)
Здравствуйте, k55, Вы писали:
К сожалению, массивы — не первоклассные граждане (тяжкое наследие), и указатель на массив так не работает. Передавай по ссылке или заверни в структуру.
Да здравствует мыло душистое и веревка пушистая.
Re: C: Не проверяет размер массива.
От: VTT http://vtt.to
Дата: 25.03.15 06:39
Оценка: +1
Здравствуйте, k55, Вы писали:

k55>Подскажите пожалуйста это так и должно быть что C компилятор не проверяет размер передаваемого массива в функцию? (Я ожидал обратное)


Во-первых вы передаете не массив, а указатель на массив (это далеко не одно и то же).

Во-вторых нормальные компиляторы очень даже ругаются на несовместимость указателей. Возможно это просто ideone подавляет предупреждения.
gcc:

main.c:13:3: warning: passing argument 1 of 'Myfunc' from incompatible pointer type [enabled by default]
Myfunc(&array);
^
main.c:3:5: note: expected 'int (*)[6]' but argument is of type 'int (*)[7]'
int Myfunc(int (*MacArray)[6])

VS (c /TC)

main.c(13): warning C4048: different array subscripts : 'int (*)[6]' and 'int (*)[7]'

Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Отредактировано 25.03.2015 6:40 VTT . Предыдущая версия .
Re[2]: C: Не проверяет размер массива.
От: night beast СССР  
Дата: 25.03.15 05:29
Оценка:
Здравствуйте, Vamp, Вы писали:

V>К сожалению, массивы — не первоклассные граждане (тяжкое наследие), и указатель на массив так не работает. Передавай по ссылке или заверни в структуру.


указатели на массивы так нормально работают. и плюсовый компилятор на изменение размера дает внятное сообщение об ошибке.
ссылки в чистых сях отсутствуют.
почему не ругается сишный компилятор не знаю, но боюсь что с этим придется смириться.
Re[2]: VS bug: new int(1,2,"wtf")
От: k55 Ниоткуда  
Дата: 25.03.15 19:29
Оценка:
Спасибо за ресурс. Не знал про такой.
Если есть желание — найдется 1000 возможностей.
Если нет желания — найдется 1000 причин.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.