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. */
};