У меня есть массив указатель символьныйДлина массива символов - C
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 **’
Я не могу понять, в чем проблема.
C никогда не отслеживает длину массивов. strlen просто выполняет итерацию по символам до тех пор, пока не найдет нулевой символ ('\ 0'), который добавляет к концу каждого из ваших строковых литералов.Поэтому, если вы передадите strlen char **, который в вашем случае указывает на группу из 3 указателей, если он сработает, он вернет значение тарабарщины. Эта ошибка - это компилятор, который избавляет вас от чего-то, чего вы почти наверняка не хотели. – Sqeaky
Чтобы предотвратить возможные будущие проблемы, вы можете захотеть определить 'array' как указывающие на немодифицируемые строки (которые имеют константные константы):' const char * array [] ' – pmg
Вы должны понимать, что C на самом деле не поддерживает «массивы * или * струны, это просто любопытно подпирает их на пару углов. Вы должны действовать очень осторожно, когда имеете дело с этим, пока не получите «почувствовать» все это. (И даже тогда есть подводные камни, которые могут уловить опытных программистов C.) –