LINUX.ORG.RU

[C]Подскажите как компилер обязан передавать массивы в ф-ю

 


0

0

есть следующая ф-я:

int func1(int arr[10]) { return arr[0]; }

обязан ли компилер создавать в стеке копию передаваемого массива?

ткните носом где об этом написано в стандартах C99/C89/etc. меня интересуют все стандарты определяющие поведение компилера в этой симтуации.

★★★★★

Массивы в C передаются по указателю. Это легко проверить. Однако, в конкретное место в стандарте языка не ткну.)

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

Еще более удивительно то, что a[i] можно записать как *(a+i). Встречая запись a[i], компилятор сразу преобразует ее в *(a+i); указанные 2 формы записи эквивалентны.. бла-бла-бла (C) K&R

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

в любой проге выполни приведенную тобой замену и сегфолт не замедлит тебя настигнуть.

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

Если имя массива передается функции, то последняя получает в качестве аргемента адресс начального элемента (C) K&R

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

test.c:
#include <stdio.h>

int func1(int* arr) { return arr[0]; }

int main () {
int a[10];

a[0]=1;
printf("%d\n", func1(a));
return 0;
}

$gcc -o test test.c
$./test
1
$

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

$ cat test.c
#include <stdio.h>
int main()
{
int a[]={0,1,2,3,4};
printf("a[2]=%d *(a+2)=%d \n",a[2],*(a+2));
}
$ gcc test.c -o test
$./test
a[2]=2 *(a+2)=2

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

5 глава Страуструпа. Массивы передаются по указателю (чтоб не спорил С и С++ в этих местах одинаковые языки)

а int arr[10] == int* arr действительно бред ибо int arr[0] == int* arr и int arr[10] == (int* arr)+10;

anonymous
()


WG14/N843 Committee Draft — August 3, 1998

6.5.2.1 Array subscripting

Constraints

1 One of the expressions shall have type ‘‘pointer to object type’’, the other expression shall have integer type, and the result has type ‘‘type’’.
Semantics

2 A postfix expression followed by an expression in square brackets [] is a subscripted designation of an element of an array object. The definition of the subscript operator [] is that E1[E2] is identical to (*((E1)+(E2))). Because of the conversion rules that apply to the binary + operator, if E1 is an array object (equivalently, a pointer to the initial element of an array object) and E2 is an integer, E1[E2] designates the E2-th element of E1 (counting from zero).

3 Successive subscript operators designate an element of a multidimensional array object. If E is an n-dimensional array (n³2) with dimensions i´ j´ . . . ´k, then E (used as other than an lvalue) is converted to a pointer to an (n−1)-dimensional array with dimensions j´ . . . ´k. If the unary * operator is applied to this pointer explicitly, or implicitly as a result of subscripting, the result is the pointed-to (n−1)-dimensional array, which itself is
converted into a pointer if used as other than an lvalue. It follows from this that arrays are stored in row-major order (last subscript varies fastest).

4 EXAMPLE Consider the array object defined by the declaration
int x[3][5];
Here x is a 3´5 array of ints; more precisely, x is an array of three element objects, each of which is an array of five ints. In the expression x[i], which is equivalent to (*((x)+(i))), x is first converted to a pointer to the initial array of five ints. Then i is adjusted according to the type of x, which conceptually entails multiplying i by the size of the object to which the pointer points, namely an array of five int objects. The results are added and indirection is applied to yield an array of five ints. When used in the expression x[i][j], that array is in turn converted to a pointer to the first of the ints, so x[i][j] yields an int.

// wbr

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

меня сейчас интерсуют исключительно обьявления и требования стандартов, так что извиняюсь - я не так тебя понял.

а что такое массивы/указатели и как с ними обращатся это мне не интересно.

cvv ★★★★★
() автор топика
Ответ на: комментарий от cvv

> меня сейчас интерсуют исключительно обьявления и требования стандартов

6.7.5.3 Function declarators (including prototypes)

7. A declaration of a parameter as ‘‘array of type’’ shall be adjusted to ‘‘qualified pointer to type’’, where the type qualifiers (if any) are those specified within the [ and ] of the array type derivation.

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