Well, perhaps, if you assigned some actual memory to details the error would go away?
You declared it as a pointer-to-pointer-to char:
char **details;
And the next thing you do with it is try to fill it up:
details[i]=(char*)(void*)Marshal::StringToHGlobalAnsi(list[i]);
At no point do you actually point it at anything...