我有一个
的指针字符数组void main(){
char* array[] =
{
[0] = "foo",
[1] = "bar",
[2] = "baz"
};
read(array);
}
并尝试使用strlen
int read(const char* events[]){
int size_of_events;
size_of_events = (strlen(events));
}
它会抛出以下警告:
warning: passing argument 1 of ‘strlen’ from incompatible pointer type [enabled by default]
In file included from test.c:6:0:
/usr/include/string.h:395:15: note: expected ‘const char *’ but argument is of type ‘char **’
我无法理解问题所在..
答案 0 :(得分:1)
你试图在非字符串上计算strlen
- 事实上是一个字符串数组。当您传递strlen
(指向字符数组数组的指针)时,char *
将char **
作为其参数。看看strlen(events[0])
会发生什么 - 应该返回3,"foo"
的长度。
答案 1 :(得分:1)
您正在尝试在指针数组上使用字符串函数。
在read
中(顺便说一下,不要使用libc函数名)events
类型为const char **
,也就是指向数组的指针或指向char的char *
指针。
在其上使用strlen
会产生不可预测的结果。如果您很幸运,它会因违反分段而导致程序崩溃。
在C数组中,惯性不具有大小或长度。您需要将其作为单独的参数传递给您的函数。
strlen
对char *
(字符数组)起作用的原因是因为约定C中的字符串由特殊的空终止符号'\0'
终止。它会计算第一个'\ n'之前的字符数。常规数组不是这种情况。
如果您想要关联字符串的长度,那么您可以使用strlen(events[0]), strlen(events[1]), strlen(events[2])
答案 2 :(得分:0)
strlen给出char*
的长度,但您传递的是char**
我认为你想要数组的长度,但你不能拥有它,因为你最后没有NULL
如果您的数组如下:
char* array[] =
{
[0] = "foo",
[1] = "bar",
[2] = "baz",
[3] = NULL, /* in stdlib.h */
};
然后你可以去找像这样的东西
int read(const char* events[]){
int size_of_events = 0;
while (events[size_of_events] != NULL)
size_of_events++;
return (size_of_events);
}
如果您的事件数组的大小未知并且您想要计算它,那么只需在末尾添加NULL
然后计算
答案 3 :(得分:0)
您需要传入一个字符串,而不是一串字符串。使用一个字符串的索引而不是**来传入一个字符串。