void foo(char c[10])
{
}
void main()
{
char arr[1000];
foo(arr); // Почему этот вызов компилируется???
// по моему, char[10] не одно и то же, что char[1000]
}
C>void foo(char c[10])
C>{
C>}
C>void main()
C>{
C> char arr[1000];
C> foo(arr); // Почему этот вызов компилируется???
C> // по моему, char[10] не одно и то же, что char[1000]
C>}
C>
C>-- C>Спасибо
Потому что в функцию передается указатель. Хочешь отличать — передавай по ссылке.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
C>void foo(char c[10])
C>{
C>}
C>void main()
C>{
C> char arr[1000];
C> foo(arr); // Почему этот вызов компилируется???
C> // по моему, char[10] не одно и то же, что char[1000]
C>}
C>
C>-- C>Спасибо
Потому что массив не передается по значению, передается только адрес первого элемента, и поэтому не проверяется размер массива.
Следовательно вызов этих функций будет одинаков
C>void foo(char c[10])
C>{
C>}
C>void main()
C>{
C> char arr[1000];
C> foo(arr); // Почему этот вызов компилируется???
C> // по моему, char[10] не одно и то же, что char[1000]
C>}
C> C>-- C>Спасибо
=)))))))) Сорри за смех, я конечно понимаю что не все всё знают !
лана
Почему этот вызов компилируется??? Потому что char c[10] означает, что в функцию ты передаёшь указатель на с + массив из 10 элементов
по моему, char[10] не одно и то же, что char[1000]??? С точки зрения цифр 1000 10 то это не одно и тоже, но точки зрения программиста это всё указатели, просто на у них разные массивы
Здравствуйте, _nn_, Вы писали:
__>Потому что массив не передается по значению, передается только адрес первого элемента, и поэтому не проверяется размер массива.
По уму, должен проверяться. Это же internal-ы компилятора, как он там передаёт параметры — по указателю или через COM-порт...
По-моему очень некрасиво сделано.
void foo(char c[10])
{
c[9] = '*';
}
void main()
{
char arr[5];
foo(arr); // и куда же оно запишет '*' ?
}
К тому же можно было бы различать сигнатуры для overload-а...
Здравствуйте, Chez, Вы писали:
C>Здравствуйте, _nn_, Вы писали:
__>>Потому что массив не передается по значению, передается только адрес первого элемента, и поэтому не проверяется размер массива. C>По уму, должен проверяться. Это же internal-ы компилятора, как он там передаёт параметры — по указателю или через COM-порт... C>По-моему очень некрасиво сделано.
C>
C>void foo(char c[10])
C>{
C> c[9] = '*';
C>}
C>void main()
C>{
C> char arr[5];
C> foo(arr); // и куда же оно запишет '*' ?
C>}
C>
C>К тому же можно было бы различать сигнатуры для overload-а...
Можно использовать ссылки на массивы.
C>Ацтой
Это одно из фундаментальных свойств языков С/С++, эти языки не проверяют выход за границы массива.
Потому, что существует неявное преобразование из массива в указатель на его первый элемент, называемое "распад". Передать массив по значению с С/С++ нельзя в принципе. Можно передать либо как указатель на первый элемент, либо по ссылке — тогда размерность будет проверена.
Здравствуйте, Vamp, Вы писали:
V>Потому, что существует неявное преобразование из массива в указатель на его первый элемент, называемое "распад". Передать массив по значению с С/С++ нельзя в принципе.
А если без принципов ?
С:
V>Можно передать либо как указатель на первый элемент, либо по ссылке — тогда размерность будет проверена.
Можно еще передать и саму размерность, главное правильный размер передать
Здравствуйте, Chez, Вы писали:
C>Здравствуйте, _nn_, Вы писали:
__>>Потому что массив не передается по значению, передается только адрес первого элемента, и поэтому не проверяется размер массива. C>По уму, должен проверяться. Это же internal-ы компилятора, как он там передаёт параметры — по указателю или через COM-порт... C>По-моему очень некрасиво сделано.
C>
C>void foo(char c[10])
C>{
C> c[9] = '*';
C>}
C>void main()
C>{
C> char arr[5];
C> foo(arr); // и куда же оно запишет '*' ?
C>}
C>
C>К тому же можно было бы различать сигнатуры для overload-а...
C>Ацтой
Так исторически сложилось еще в С, а потом переехало в С++, естественно.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!