Имея это:
#define _DEFAULT_SOURCE 1
#include <stdio.h>
#include <string.h>
int main(){
char *token, org[] = "Cats,Dogs,Mice,,,Dwarves,Elves:High,Elves:Wood";
while((token=strsep(&org,",")))
printf("Token: %s\n",token);
}
дает ошибку (несовместимый тип указателя):
/usr/include/string.h:439:14: note: expected ‘char ** restrict’ but argument is of type ‘char (*)[47]’
extern char *strsep (char **__restrict __stringp,
Я знаю, что это другой тип (у одного инициализирована память - > org[]
, но функция хочет указатель без инициализации памяти), но они имеют такое же поведение , так почему он все равно жалуется?
И может кто-нибудь объясните мне, что означает это ключевое слово restrict
или __restrict
в случае *strsep (char **__restrict __stringp,
(с другой стороны, я предполагаю, что __stringp
не является внутренним типом данных (из-за двойного подчеркивания), а всего лишь причудливым имя переменной).
Изменить: я думаю, что массив хранится в стеке, но strsep
хочет указатель, указывающий на кучу, что можно сделать с помощью org
выделяется с помощью malloc
, а затем memcpy
, или, что еще лучше, скопируйте строку через strdup
(что делает внутренне memcpy
). Но в любом случае, способ strsep
хочет, чтобы указатель указывал на кучу, а не на стек? Оба являются просто указателями, указывают только на разные адреса, но это не должно иметь значения.