0

我有一个名称数组存储在char *namelist[]. 当我将它传递给函数时,我无法显示以下所有名称namelist

int ReadListOfName(const char* names[])
{
  //Note: I always get the len = 1
  //      Anyway I can get total items in names

  int len = sizeof(names)/sizeof(char*);
  for (i=0; i<len; i++)
    printf("%d-%s\n",i,names[i]);

  return 0;

}

int main(void)
{
  const char* names[] = {"a","b","c"};
  ReadListOfName(names);
  return 0;
}

有什么问题?

4

6 回答 6

4
int len = sizeof(names)/sizeof(char*);

这不会让你得到元素的数量,sizeof也不会在指针上做你想要的。您必须将长度作为附加参数传递给函数。此C 常见问题解答中也进行了讨论。你可以试试:

int ReadListOfName(const char* names[], size_t len)
/* ... */

ReadListOfName(names, sizeof(names)/sizeof(names[0]));
于 2012-07-05T06:13:42.760 回答
1
int ReadListOfName(const char* names[])

在这names基本上变成char **而不是char * []定义你的main.

于 2012-07-05T06:16:20.333 回答
1

您需要传入另一个参数来ReadListOfName指定数组的长度,或者在您的数组中有一个终止值argv。当传递给函数时,数组将衰减为指针;achar*[]将衰减为 a char**,因为您正在传递数组中第一个元素的地址。因此,您的功能实际上被解释为:

int ReadListOfName(const char **names)

你实际上是在 equating sizeof(char**)/sizeof(char*),它不会给你数组中的元素数量(它可能会给你 1)。

添加一个长度参数,然后len在传递它之前进行计算ReadListOfName

请注意,除了除以sizeof(names)获取sizeof(char*)数组中的元素数量之外,您还可以除以,如果您更改 中元素的类型,则sizeof(*names)无需担心更改:char*names

int len = sizeof(names)/sizeof(*names);
于 2012-07-05T06:20:54.267 回答
1

由于其他答案已经解释了将数组引用传递给函数时会发生什么,请找到一种解决问题的方法,而无需在打印名称的方法中添加另一个参数。

您可能想像这样在列表中添加一个停止元素:

#include <stdio.h>

int ReadListOfName(const char ** names)
{
  for (int i=0; names[i]; i++)
    printf("%d-%s\n",i,names[i]);

  return 0;
}

int main(void)
{
  const char* names[] = {"a","b","c", NULL}; /* Please note the additional, last element. */
  ReadListOfName(names);
  return 0;
}

这种方法与传递两个参数来描述列表的本质区别names[]在于,它的使用不易出错,因为列表大小的信息来自列表本身,但来自第二个独立提供的值。

于 2012-07-05T06:26:01.453 回答
0

sizeof(AnyPointer)给出字长。对于 32 位操作系统,将返回 4。同样 8 将在 64 位机器中返回。

也是如此sizeof(char*) == sizeof(float*) == sizeof(int*)

If your OS is 32-bit,
sizeof(names) will be 4.
sizeof(char*) also 4.

显然你会得到len = 1.

于 2012-07-05T07:25:39.393 回答
0

您应该传递一个附加参数,该参数将明确提及数组的长度。以及在哪里初始化设置一些 MACRO 来摆弄 sizeofs。

于 2012-07-05T09:14:41.530 回答