8

所以我有一个文件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] .. %s\n", (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

只有我的原始数组的第一个元素。

我尝试推迟参数,将数组的指针传递给它,并且同时传递两者。
奇怪的是,同一行代码在 main 函数中工作。我真的不想通过向函数添加一个数组参数长度来解决这个问题。

任何帮助是极大的赞赏。

4

1 回答 1

9

这是因为数组在传递给像您这样的函数时会衰减为指向其第一个元素的指针,并且没有保留有关元素数量的信息。在声明数组的范围内,这种衰减没有发生,所以sizeof有效。

您必须添加数组长度作为额外参数,或者确保数组以适当的标记值终止。一个流行的这样的值是NULL,即您确保最后一个有效索引包含一个值为 的字符串指针NULL,然后指示“没有更多数据,停止”:

const char *menu[] =
{
    "Customers",
    "Orders",
    "Products",
    NULL /* This is a sentinel, to mark the end of the array. */
};
于 2012-11-27T11:58:13.483 回答