массив как аргумент функции - PullRequest
       0

массив как аргумент функции

1 голос
/ 09 сентября 2010

рассмотрим следующий код:

#define MAX_COUNT 4
static int foo(int w[MAX_COUNT])
{
    int *p = w;

    if (w) {
        w[0] = 10; w[1] = 20; w[2] = 30; w[3] = 40;
    }

    return 0;
}

это переносимый и допустимый пароль NULL для определенного выше foo () (например, для ситуации, когда мне не нужно изменять w [])?Учитывая, что имя массива является указателем на его первый элемент, мне кажется, что все должно быть в порядке, но perhpas я что-то упустил?

Спасибо!

Ответы [ 3 ]

4 голосов
/ 09 сентября 2010

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

static int foo(int w[]);
static int foo(int* w);

Так что да, допустимо передавать NULL этой функции.

Учитывая, что имя массива является указателем на его первый элемент

Не совсем.Массив распадается на указатель на свой начальный элемент при большинстве обстоятельств , за исключением случаев, когда он является операндом sizeof или унарным & операторомоператор).

1 голос
/ 09 сентября 2010

C99 имеет конструкцию с отличным синтаксисом (для вашего примера)

static int foo(int w[static MAX_COUNT]);

, что в основном означает, что функция ожидает по крайней мере MAX_COUNT элементы. Вызов такой функции с NULL будет рассматриваться как ошибка.

К сожалению, эта функция пока широко не реализована. например, gcc и clang просто примите синтаксис, но ничего полезного с Информация.

1 голос
/ 09 сентября 2010

Все должно быть в порядке. Количество элементов в массиве, который вы передали, является просто формализмом и не является действительно необходимым. w это просто указатель на int. Нет другой проверки времени выполнения или проверки компиляции.

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