Добавление статических структур в массив, который является параметром функции - PullRequest
0 голосов
/ 08 июня 2019

Если я объявлю массив внутри функции main () и отправлю этот массив в функцию в качестве параметра, могу ли я добавить в этот массив элементы, которые не являются указателями, созданными с помощью malloc?

Я понимаю, чтостатические переменные, созданные внутри функции, помещаются в стек и становятся ненадежными после возврата из функции.Однако, поскольку массив инициализируется как статический массив в main (), ячейки памяти в массиве должны быть сохранены после возврата из вспомогательной функции, нет?

typedef struct test_t {
    int x,y;
} test;

void fillArray(test arr[], int length) {
    int i;
    for (i=0; i<length; i++) {
        arr[i] = (test){i,i*3}
    }
    return;
}

void main() {
    test arr[5];
    fillArray(arr, 5);
    int i;
    for (i=0; i<5; i++) {
        printf("(%d,%d)\n", arr[i].x, arr[i].y);
    }
}

Я ожидаю, что этот игрушечный пример будетвести себя правильно, потому что ничего особенного не происходит, но это технически неопределенное поведение или это безопасно?

1 Ответ

0 голосов
/ 08 июня 2019

В большинстве контекстов (*) массивы преобразуются в указатель на их первый элемент.

В вашем случае, когда используется как аргумент функции, массив test arr[5] преобразуется в указатель на свой первый элемент (в &arr[0]) типа test*. Содержимое указанных объектов является изменяемым, и они сохраняют изменения, когда элемент управления возвращается к main().

В вашем коде только 3 ошибки:

  1. отсутствует #include <stdio.h>
  2. void main() должно быть int main(void)
  3. отсутствует ; в теле for внутри fillArray()

(*) Исключения составляют случаи, когда массив используется в качестве аргумента оператора sizeof или & или когда это строковый литерал, используемый для инициализации объекта массива.

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