Создание std :: string из Char * в переполнении стека

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 = ""; определяется как глобальный

-1

Решение

Вы слишком щедры со звездочками — как правило, вам не нужен указатель на CFStringRefи ваш массив на самом деле массив указателей, а это не то, что вы хотите.

Это должно выглядеть больше так:

CFStringRef s;
char c[128];

if (CFStringGetCString(s, c, 128, kCFStringEncodingUTF8))
{
g_uid = c;
}
else
{
// 128 characters wasn't enough.
}
2

Другие решения

Если c где char*будет работать следующее:

g_uid.assign(c, size);

Проблема в том, что c не char*это массив из 128 char*s:

char *c[128];
0

Это распространенная ошибка новичков в C / C ++. Я помню, что делал ту же ошибку в тот день. Декларация как
char *c[128]; не дает вам массив из 128 символов, как вы могли бы поверить. Это фактически дает вам массив из 128 указателей на chars. Вы этого не хотите.

Вы хотите объявить массив из 128 символов, который выглядит следующим образом:

char c[128];

Теперь вы можете не думать, что c был char* потому что вы не видите ничего *s, но каждый раз, когда вы объявляете массив чего-либо, эта переменная автоматически становится указателем любого типа, который вы укажете. Это на самом деле указывает на адрес самого первого элемента массива.

0
По вопросам рекламы [email protected]