Стек стека массива типов в C - PullRequest
1 голос
/ 06 октября 2009

У меня есть следующая функция

void DoSomething(int start[10], int end[10])

Когда я звоню через

void Do(void)
{
  int start[10] = {1,2,3,4,5,6,7,8,9,0};
  int end[10] = {1,2,3,4,5,6,7,8,9,0};
  DoSomething(start,end);
}

положить в стек два указателя (все 8 байт) или два массива размером 40 байт каждый?

Ответы [ 5 ]

7 голосов
/ 06 октября 2009

В C аргументы массива для функции на самом деле являются указателями, поэтому вы помещаете в стек два указателя, а копия массива не создается.

Это было бы так же, как если бы подпись DoSomething была:

void DoSomething(int *start, int *end);
1 голос
/ 07 октября 2009

чтобы передать массивы по значению, поместите их в структуры, то есть (псевдокод):

struct int10 {
  int arr[ 10];
};

void DoSomething( struct int10 start, struct int10 end);

void Do(void) {
  struct int10 start;
  struct int10 end;
  ...
  DoSomething( start, end);
}
1 голос
/ 06 октября 2009

Массивы распадаются на указатели в C. Вы помещаете адрес первых элементов начала и конца в стек.

0 голосов
/ 06 октября 2009

Вы передаете указатели на вызываемую функцию.

void DoSomething(int start[10], int end[10]) {
    int x=0, k=10;
    while (k--) x += *(start++) * *(end++);
    if (x == 285) {
        /* OK: 1*1 + 2*2 + 3*3 + ... + 9*9 is 285 */
    }
}

void Do(void) {
    int start[10] = {1,2,3,4,5,6,7,8,9,0};
    int end[10] = {1,2,3,4,5,6,7,8,9,0};
    DoSomething(start, end);
}
0 голосов
/ 06 октября 2009

Вы помещаете значения массива в автоматическое хранилище (обычно в стек) в Do, но только передаете указатели на эти массивы в качестве аргументов DoSomething.

Будет ли аргументы переданы в стек или как регистры, зависит от ABI вашей среды. Если архитектура передает аргументы в виде регистров и вызов встроен компилятором и DoSomething не нуждается в каких-либо переменных, возможно, DoSomething не использует стек. И наоборот, некоторые архитектуры всегда передают аргументы в стеке, а некоторые компиляторы не встроены, и в этом случае в стеке будут значения аргументов в качестве адресов массивов, а также другие состояния, например адрес возврата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...