我在函数中有以下代码
char MenuOptions[7][200];
strcpy(MenuOptions[0], "Create New / Modify Existing Customer");
strcpy(MenuOptions[1], "Create New / Modify Existing Product");
strcpy(MenuOptions[2], "List All customers");
strcpy(MenuOptions[3], "List All Products");
strcpy(MenuOptions[4], "Batch Update of New Stock");
strcpy(MenuOptions[5], "Create Customer Order");
strcpy(MenuOptions[6], "View Last Order for Customer");
switch (displayMenu("Main Menu", MenuOptions, 7, TRUE)) {
etc....
和
char displayMenu(char *name, char *options[], int menuLength,
enBoolean QuitEnabled) {
int i;
printf("%s: \n", name);
for (i = 0; i < menuLength; i++) {
printf("\t %d %s.\n", (i + 1), options[i]);
}
if (QuitEnabled == TRUE)
printf("\t Q. Quit\n");
etc
一旦输入了displayMenu方法,MenuOptions数组似乎从内存中丢失了。我尝试通过eclipse中的表达式窗口看到了哪些选项[i],它说它是“超出界限”作为值
答案 0 :(得分:1)
options
中displayMenu
的类型必须为char (*options)[200]
。不是char *options[]
。
除非它是sizeof
的操作数。 _Alignof
或一元&
运算符,或者是一个字符串文字用于初始化声明中的数组,表达式类型为“{元素数组{{1 “将被转换(”衰减“)到”指向T
的指针“类型的表达式。在这种情况下,T
是由MenuOptions
的200个元素数组组成的7元素数组;根据上面的规则,它将衰减为“指向char
的200个元素数组的类型”的表达式。
如上所述,char
的类型为options
; char **
为您提供options[i]
指向数组基础后i
的指针,而不是char
' 200元素数组i
} 的。
答案 1 :(得分:1)
首先,在编译器中打开警告选项。您的编译器应该警告您存在类型不匹配。
MenuOptions
是一个由七个200 char
数组组成的数组。调用displayMenu
并将MenuOptions
作为参数传递时,MenuOptions
会自动从数组转换为指向七个200 char数组中第一个的指针。
在displayMenu
中,options
参数声明为char *options[]
。这意味着options
是指向char
的指针数组。在函数参数中,[]
是特殊的;它表明将为此参数传递一个数组,但该数组实际上是通过其第一个参数的地址传递的。因此,这个声明说options
是指向char
的一些指针中的第一个的指针。
所以,你传递一个指向七个200 char数组中第一个的指针,但是该函数希望得到指向char
的一些指针中的第一个指针。
解决此问题的一种方法是将options
的声明更改为char (*options)[200]
。这表示options
是指向(第一个)200 char数组的指针。
更好的解决方法可能是更改MenuOptions:
static const char *MenuOptions[] =
{
"Create New / Modify Existing Customer",
"Create New / Modify Existing Product",
"List All customers",
"List All Products",
"Batch Update of New Stock",
"Create Customer Order",
"View Last Order for Customer",
};
(括号中不需要“7”,因为编译器会为你计算字符串。)
然后您不需要更改options
的声明,除了我已添加const
:
char displayMenu(char *name, const char *options[], int menuLength,
enBoolean QuitEnabled) {…
现在:
MenuOptions
是一个包含七个字符串指针的数组(char数组)。它作为指向字符串指针的指针传递,options
是指向字符串指针的指针,因此类型匹配。MenuOptions
不占用超出要求的空间。以前,每个字符串定义为200个字符。现在,每个字符串只占用所需的空间(在末尾加上一个空字符,并指向MenuOptions
数组中字符串的指针)。const
以避免意外更改字符串。MenuOptions
被声明为static
,因此它在编译时被初始化,并且您不需要在运行时将字符串复制到其中。最后,您可以使用displayMenu
替换sizeof MenuOptions / sizeof *MenuOptions
来电中的“7”。这将数组的大小除以数组元素的大小,给出数组中元素的数量。这比硬编码常数更受欢迎,因为它消除了某人可能在不改变硬编码常数的情况下改变数组大小的可能性。
答案 2 :(得分:0)
一个选项:
char displayMenu(char *name, char options[][200], int menuLength, enBoolean QuitEnabled)
答案 3 :(得分:0)
更改输入类型:
char displayMenu(char *name, char *options[], ...
反映它是一个多维数组:
char displayMenu(char *name, char options[][200], ...
其他可行的选项:
char displayMenu(char *name, char options[7][200], ...
char displayMenu(char *name, char (*options)[200], ...
重点是当传递多维数组时,所有维度都超过第一个,也需要传递。