我正在尝试在C
中枚举一个数组(就像在python
中你可以使用#enumerate函数一样)。
static enumerate(const char *data[])
{
int i;
int stopLength = sizeof(data);
for(i=0; i < stopLength; i++)
{
printf("[%d] %s", i+1, data[i]);
}
}
int main(int argc, char *argv[])
{
char *friends[] = {"test", "test", "test"};
enumerate(friends);
}
但是当我尝试使用此功能时,我收到以下错误:
utilis.c: In function ‘int enumerate(char**)’:
utilis.c:58:33: warning: ‘sizeof’ on array function parameter ‘data’ will return size of ‘char**’ [-Wsizeof-array-argument]
int stopLength = sizeof(data);
^
utilis.c:55:29: note: declared here
static enumerate(char *data[])
^
utilis.c: In function ‘int main(int, char**)’:
utilis.c:78:46: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
char *friends[] = {"test", "test", "Test"};
^
utilis.c:78:46: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
utilis.c:78:46: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
我理解错误告诉我的内容,但我不明白如何实现我想要做的事情。在python
我可以这样做:
friends = ["test", "test", "test"]
for i, f in enumerate(friends, start=1):
print "[{}] {}".format(i, f)
# [1] test
# [2] test
# [3] test
如何让我的C
函数按我的意愿运行?
答案 0 :(得分:1)
问题是数组在传递给函数时会衰减为指针。在enumerate
函数中,data
实际上是char **
类型的指针,即使您已将其声明为数组 - char *[]
。没有办法直接将整个数组传递给函数。必须另外传递大小作为参数,或者包含在结构中,例如。
C数组在运行时不知道它们的大小。只有在声明静态大小的数组(不是指针)时,才能通过sizeof(arr) / sizeof(*arr)
表达式获取其大小(在编译时计算) :
int arr[42];
/* the result will be equal to `sizeof(int) * 42` */
printf("arr size: %zu\n", sizeof(arr) / sizeof(*arr));
分子是数组的总大小(以字节为单位),分母是每个元素的大小,给出了数组的编译时大小(在运行时不能动态更改)。
答案 1 :(得分:1)
由于它是一个函数参数,因此数组会调整为指向第一个元素的指针。在您的情况下,指向数组中的第一个指针。你不能使用enumerate(sizeof(array)/sizeof(*array), array);
,因为这只会产生一个指针的大小,这并不是很有用。相反,您需要将数组的大小传递给函数:
[
{"PieChart", Piechartdata, 0,1},
{"donut", donutdata, 1,0},
{"grid", griddata, 1,1}
]
呼叫者:
*ngFor