OSX 10.8, Carbon
У меня есть std :: string, которую я хочу получить из Char *
Пример:
CFStringRef *s;
char *c[128];
CFStringGetCString(*s, *c, 128, kCFStringEncodingUTF8);
int size = sizeof(c);
g_uid.assign(c, size);
Но я получаю недопустимое преобразование и не понимаю, почему
error: invalid conversion from 'char**' to 'long unsigned int'
std::string g_uid = "";
определяется как глобальный
Вы слишком щедры со звездочками — как правило, вам не нужен указатель на CFStringRef
и ваш массив на самом деле массив указателей, а это не то, что вы хотите.
Это должно выглядеть больше так:
CFStringRef s;
char c[128];
if (CFStringGetCString(s, c, 128, kCFStringEncodingUTF8))
{
g_uid = c;
}
else
{
// 128 characters wasn't enough.
}
Если c
где char*
будет работать следующее:
g_uid.assign(c, size);
Проблема в том, что c
не char*
это массив из 128 char*
s:
char *c[128];
Это распространенная ошибка новичков в C / C ++. Я помню, что делал ту же ошибку в тот день. Декларация как
char *c[128];
не дает вам массив из 128 символов, как вы могли бы поверить. Это фактически дает вам массив из 128 указателей на char
s. Вы этого не хотите.
Вы хотите объявить массив из 128 символов, который выглядит следующим образом:
char c[128];
Теперь вы можете не думать, что c
был char*
потому что вы не видите ничего *
s, но каждый раз, когда вы объявляете массив чего-либо, эта переменная автоматически становится указателем любого типа, который вы укажете. Это на самом деле указывает на адрес самого первого элемента массива.