Подскажите пожалуйста это так и должно быть что 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;
}
Здравствуйте, k55, Вы писали:
k55>Подскажите пожалуйста это так и должно быть что C компилятор не проверяет размер передаваемого массива в функцию? (Я ожидал обратное)
Прежде чем делать задавать такие вопросы, стоит проверить компилируемость кода на нескольких компиляторах, не забыв выкрутить на максимум предупреждения (превратив их заодно в ошибки) и задав режим по возможности наиболее точного следования стандарту. При несовпадении результатов можно обратиться и к самим скрижалям.
Здравствуйте, k55, Вы писали:
К сожалению, массивы — не первоклассные граждане (тяжкое наследие), и указатель на массив так не работает. Передавай по ссылке или заверни в структуру.
Здравствуйте, 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]'
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Здравствуйте, Vamp, Вы писали:
V>К сожалению, массивы — не первоклассные граждане (тяжкое наследие), и указатель на массив так не работает. Передавай по ссылке или заверни в структуру.
указатели на массивы так нормально работают. и плюсовый компилятор на изменение размера дает внятное сообщение об ошибке.
ссылки в чистых сях отсутствуют.
почему не ругается сишный компилятор не знаю, но боюсь что с этим придется смириться.