C: передайте массив строки как аргумент функции

Итак, у меня есть файл main.c который включает файл заголовка, который я сделал utils.h, содержащий прямые ссылки на функции в моем исходном файле utils.c

в utils.c:

у меня есть функция, которая принимает массив строк в качестве аргумента и печатает его как меню:

void showMenu(const char *menu[])
{
    int menulen = sizeof(menu)/sizeof(*menu);

    int i;
    for(i = 0; i < menulen; i++)
    {
        printf("[%d] .. %sn", (i+1), menu[i]);
    }
}

в Main.c:

Я просто называю эту функцию:

const char *menu[] =
{
        "Customers",
        "Orders",
        "Products"
};

int main(void)
{
    showTitle("Customer Orders System");
    int menulen = sizeof(menu)/sizeof(*menu);
    showMenu(menu);
    getch();
}

мой Проблема:

мой showMenu функция вычисляет длину массива, а затем перебирает его, печатая строки. Это работало, когда функция была в main.c, но я должен организовать этот проект в отдельных файлах.

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

const char** menu

имея только первый элемент исходного массива.

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

любая помощь очень ценится.

1 ответов


это потому, что массивы распад в указатели на их первый элемент при передаче в такую функцию, как ваша, и нет никакой информации о количестве элементов. В области, где объявлен массив, этого распада не произошло, поэтому sizeof строительство.

вы должны либо добавить длину массива в качестве дополнительного аргумента, либо убедиться, что массив завершается соответствующим страж значение. Одним из популярных таких значений является NULL, т. е. вы делаете конечно, последний допустимый индекс содержит строковый указатель, значение которого NULL, который затем указывает "нет больше данных, стоп":

const char *menu[] =
{
    "Customers",
    "Orders",
    "Products",
    NULL /* This is a sentinel, to mark the end of the array. */
};