Подозрительное преобразование указателя

Я получил подозрительную ошибку преобразования указателя здесь. Что может быть причиной этой ошибки?

Я также глобально инициализировал массив code[] как int *code[128]={0};.

void encode(const char *s, int *out)
{
    while(*s)
    {
        out=code[*s];
        out+=strlen(code[*s++]);   //this is where i got the error.
    }
}

person user3180801    schedule 10.01.2014    source источник
comment
Является ли тип code const char *? Кстати, добро пожаловать в SO!   -  person A Person    schedule 10.01.2014
comment
Нет, это int, как объявлено, int *code[128]={0}; Спасибо   -  person user3180801    schedule 10.01.2014
comment
Вот и все, strlen принимает указатель на const char. Вы не можете использовать элемент code в качестве аргумента для strlen. Компилятор не видит никакого явного приведения, сделанного программистом (вами), и поэтому предупреждает вас о подозрительном приведении указателя для int к const char   -  person A Person    schedule 10.01.2014
comment
Какой метод я могу заменить в этой ситуации?   -  person user3180801    schedule 10.01.2014
comment
Я пока не могу сказать, что вы неправильно используете strlen, потому что я не знаю, для чего вы его использовали. Как вы думаете, что даст вам стрлен? Перефразируя, для чего вы намеревались использовать strlen?   -  person A Person    schedule 10.01.2014
comment
Мне нужно, чтобы он знал длину целого числа.   -  person user3180801    schedule 10.01.2014
comment
Длина как количество цифр, количество байтов? strlen дает длину строки с завершающим нулем в no. символов, поэтому другие методы должны работать   -  person A Person    schedule 10.01.2014
comment
В порядке. Я проверю это. Спасибо.   -  person user3180801    schedule 10.01.2014
comment
? Нет, strlen здесь не сработает! Какие единицы вы имеете в виду в отношении длины целого числа?   -  person A Person    schedule 10.01.2014


Ответы (1)


Когда вы назначаете переменной указателя определенного типа адрес другого типа, такой тип автоматического преобразования типа называется преобразованием подозрительного типа.

Для strlen требуется const char *, тогда как int *code[128] означает, что code представляет собой массив int *, поэтому code[*s++] представляет собой int *.

Когда int * передается в const char *, вы получаете эту ошибку.

Как правило, предоставление указателя int * на strlen не является хорошей идеей, потому что strlen заканчивается, когда байт равен '\ 0'. У вас есть хороший шанс иметь 0 в 4 байтах int. Например, целое число 3 будет иметь 3 байта 0 и 1 байт 3.

person user534498    schedule 10.01.2014